Pandas中的Groupby,map和sum导致NaN

时间:2018-04-26 16:15:44

标签: python pandas numpy pandas-groupby

数据每个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'])

4 个答案:

答案 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)

我们可以使用groupbymul

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.factorizenp.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