2

现在我有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()

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

event  |    id   | amount raised
--------------------------
1      |    a    |  3
1      |    b    |  3
1      |    c    |  4
1      |    e    |  0
2      |    a    |  5
2      |    d    |  6
4

2 回答 2

3

做一个外连接:

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

如果您需要DataFrame'event'列排序,那么您可以执行

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

'ID'如果您有不同的列名要合并,在这种情况下,假设您Donors可以'fundraiser 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
于 2013-08-14T15:53:35.160 回答
1
>>> 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
于 2013-08-14T15:53:29.190 回答