数据每个ID多行
ID Value1 Value2
1 1 0
1 0 1
1 3 1
期望的输出
对于每个ID,(SUM(Value1))*(Value2)。
在这种情况下,对于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'])
答案 0 :(得分:5)
您可以使用.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
答案 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
答案 2 :(得分:3)
您可以使用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
答案 3 :(得分:2)
使用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