我有一张这样的桌子:

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/

10-09 15:32