Python:如何对熊猫人之间的付款进行分组和总和?

时间:2018-10-26 13:27:41

标签: python pandas group-by

我有一个数据框df,其中包含从Name1Name2的付款信息,其中包含某些用户的信息。

df
      Name1    Name2    amount
0     Tom       Jack     554
1     Eva       Laura    334
2     Eva       Tom      45
3     Jack      Sara     120
4     Jack      Tom      30

我想groupby,对于每个名字,总金额为spent,总金额为received

df
     Name      Spent    Received
0     Tom      554        75
1     Jack     150        554
2     Sara      0         120
3     Laura     0         334
4     Eva      379         0

1 个答案:

答案 0 :(得分:2)

melt与汇总sum一起使用,并通过unstack重塑形状:

df = (df.melt('amount', value_name='Name')
        .groupby(['Name', 'variable'])['amount']
        .sum()
        .unstack(fill_value=0)
        .rename(columns={'Name1':'Spent','Name2':'Received'})
        .rename_axis(None, 1)
        .reset_index())
print (df)
    Name  Spent  Received
0    Eva    379         0
1   Jack    150       554
2  Laura      0       334
3   Sara      0       120
4    Tom    554        75

另一个groupbyconcat双重的解决方案:

df = (pd.concat([df.groupby('Name1')['amount'].sum(),
                df.groupby('Name2')['amount'].sum()], 
                axis=1, 
                keys=('Spent','Received'))
        .fillna(0)
        .rename_axis('Name')
        .reset_index())
print (df)
    Name  Spent  Received
0    Eva  379.0       0.0
1   Jack  150.0     554.0
2  Laura    0.0     334.0
3   Sara    0.0     120.0
4    Tom  554.0      75.0