基于2个键的python pandas合并数据

2024-05-21 00:57:51 发布

您现在位置:Python中文网/ 问答频道 /正文

现在我有2个数据帧。一个有捐赠者信息,一个有募捐者信息。 理想情况下,我想做的是为每个捐赠者汇总他们的捐款,并将其存储在募捐者数据框中。问题是有可能在多个活动中有一个募捐者(所以需要使用id和event作为键),而不是所有的募捐者都实际收集到任何东西。我已经想出了如何按捐赠数据框分组来计算募捐者筹集到的金额,但我不知道如何将这些信息传递到募捐者数据框中:(

import pandas as pd
Donors = pd.DataFrame({"event": pd.Series([1,1,1,1,2,2]), "ID": pd.Series(['a','a','b','c','a','d']), "amount": ([1,2,3,4,5,6])})
fundraisers = pd.DataFrame({"event": pd.Series([1,1,1,2,2,1]), "ID": pd.Series(['a','b','c','a','d','e'])})

foo = Donors.groupby(["event", "ID"])["amount"].sum().reset_index()

理想情况下,我希望募捐框架看起来像:

^{pr2}$

Tags: 数据event信息iddataframe情况金额amount
2条回答
>>> indexed = fundraisers.set_index(['ID', 'event'])
>>> indexed['amount'] = Donors.groupby(['ID', 'event'])['amount'].sum()
>>> indexed
          amount
ID event        
a  1           3
b  1           3
c  1           4
a  2           5
d  2           6
e  1         NaN

执行外部连接:

In [15]: pd.merge(foo,fundraisers,how='outer').fillna(0)
Out[15]:
   event ID  amount
0      1  a       3
1      1  b       3
2      1  c       4
3      2  a       5
4      2  d       6
5      1  e       0

如果您需要按'event'列对DataFrame进行排序,那么您可以这样做

^{pr2}$

如果您有不同的列名,在本例中,假设Donors中的'ID'应该是{},您可以这样做

In [42]: merge(foo, fundraisers, left_on=['fundraiser ID', 'event'], right_on=['ID', 'event'], how='outer')
Out[42]:
   event fundraiser ID  amount ID
0      1             a       3  a
1      1             b       3  b
2      1             c       4  c
3      2             a       5  a
4      2             d       6  d
5      1           NaN     NaN  e

相关问题 更多 >