2

現在、2 つのデータフレームがあります。1 つは寄付者情報、もう 1 つは募金活動情報です。理想的には、私がやりたいことは、各寄付者が寄付を合計し、募金活動のデータフレームに保存することです。問題は、複数のイベントで募金活動を行うことができ (そのため、ID とイベントをキーとして使用する必要があります)、すべての募金活動が実際に何かを集めるわけではないことです。寄付データフレームをグループ化して、何かを集めた募金活動者によって集められた金額を計算する方法を見つけましたが、その情報を募金活動データフレームに渡す方法がわかりません:(

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 に答える