我有一张这样的桌子:
In [2]: df = pd.DataFrame({
...: 'donorID':[101,101,101,102,103,101,101,102,103],
...: 'recipientID':[11,11,21,21,31,11,21,31,31],
...: 'amount':[100,200,500,200,200,300,200,200,100],
...: 'year':[2014,2014,2014,2014,2014,2015,2015,2015,2015]
...: })
In [3]: df
Out[3]:
amount donorID recipientID year
0 100 101 11 2014
1 200 101 11 2014
2 500 101 21 2014
3 200 102 21 2014
4 200 103 31 2014
5 300 101 11 2015
6 200 101 21 2015
7 200 102 31 2015
8 100 103 31 2015
我想按捐赠者统计捐赠者-受赠者对的数量(同一捐赠者在n年内对同一受赠者的捐赠,其中n可以是任意数字,不必是连续的,但我在这里使用2来保持简单)。在这种情况下,捐赠者101在2014年和2015年向受赠者11和21捐赠,101的计数为2。102的数字是0,103的数字是1。结果表如下所示:
donorID num_donation_2_years
0 101 2
1 102 0
2 103 1
我试过使用groupby和pivot_表,但没能得到正确的答案。有没有关于熊猫的建议值得赞赏?谢谢!
最佳答案
有点像
df1=df.groupby('donorID').apply(lambda x : x.groupby(x.recipientID).year.nunique().gt(1).sum())
df1
Out[102]:
donorID
101 2
102 0
103 1
dtype: int64
获取数据帧
df1.to_frame('num_donation_2_years').reset_index()
Out[104]:
donorID num_donation_2_years
0 101 2
1 102 0
2 103 1
暗提不使用
apply
这是最新消息
df1=df.groupby(['donorID','recipientID']).year.nunique().gt(1).sum(level=0)
df1
Out[109]:
donorID
101 2.0
102 0.0
103 1.0
Name: year, dtype: float64
df1.to_frame('num_donation_2_years').reset_index()
Out[104]:
donorID num_donation_2_years
0 101 2
1 102 0
2 103 1
关于python - 如何根据 Pandas 另一栏中的条件计算记录的频率?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48123740/