我有一个数据框df
,其中包含从Name1
到Name2
的付款信息,其中包含某些用户的信息。
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
答案 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
另一个groupby
和concat
双重的解决方案:
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