Python 大熊猫中的Groupby、map和sum导致NaN
每个ID有多行数据Python 大熊猫中的Groupby、map和sum导致NaN,python,pandas,numpy,pandas-groupby,Python,Pandas,Numpy,Pandas Groupby,每个ID有多行数据 ID Value1 Value2 1 1 0 1 0 1 1 3 1 期望输出 对于每个ID,(总和(值1))*(值2) 在这种情况下,ID1的值为4*0=0 我想把结果放回原来的表格,如下所示 ID Value1 Value2 Calculated_Value 1 1 0 0 1 0 1 4 1 3 1 4 我已经试过了…它运行了,但是我在输出表
ID Value1 Value2
1 1 0
1 0 1
1 3 1
期望输出
对于每个ID,(总和(值1))*(值2)
在这种情况下,ID1的值为4*0=0
我想把结果放回原来的表格,如下所示
ID Value1 Value2 Calculated_Value
1 1 0 0
1 0 1 4
1 3 1 4
我已经试过了…它运行了,但是我在输出表中得到了NaN
df['Calculated_Value'] = df['ID'].map(df.groupby('ID')['Value1'].sum()*['Value2'])
您可以为此使用
groupby.transform
:
df['Calculated_Value'] = df.groupby('ID')['Value1'].transform('sum') * df['Value2']
print(df)
ID Value1 Value2 Calculated_Value
0 1 1 0 0
1 1 0 1 4
2 1 3 1 4
我们可以使用
groupby
和mul
df['Yourvalue']=df.set_index('ID').Value2.mul(df.groupby('ID').Value1.sum(),level=0).values
df
Out[278]:
ID Value1 Value2 Yourvalue
0 1 1 0 0
1 1 0 1 4
2 1 3 1 4
您可以使用
.transform
:
df['Calculated_Value'] = df.groupby('ID').Value2. \
transform(lambda x: x * df['Value1'].sum())
print df
# ID Value1 Value2 Calculated_Value
# 0 1 1 0 0
# 1 1 0 1 4
# 2 1 3 1 4
使用
pd.factorize
和np.bincount
f, u = pd.factorize(df.ID)
df.assign(YourValue=np.bincount(f, df.Value1)[f] * df.Value2)
ID Value1 Value2 YourValue
0 1 1 0 0.0
1 1 0 1 4.0
2 1 3 1 4.0
超级粗略地使用
fillna
自动告诉我是否应该向下转换到int
f, u = pd.factorize(df.ID)
df.assign(YourValue=np.bincount(f, df.Value1)[f] * df.Value2).fillna(
0, downcast='infer')
ID Value1 Value2 YourValue
0 1 1 0 0
1 1 0 1 4
2 1 3 1 4