计算某一行的出现频率

时间:2016-06-07 01:53:52

标签: python pandas

假设我有一个包含3列的数据框

     date        amount     type
0   20160101     50        apple 
1   20160101     50        apple  
2   20160101     50        banana 
3   20160102     30        apple        
4   20160102     50        apple
5   20160102     40        banana
6   20160102     40        banana 

我想要做的是使用所有列来计算行出现的频率,结果应该类似于

date      amount      type      times
20160101   50         apple     2
20160101   50         banana    1
20160102   30         apple     1
20160102   50         apple     1
20160102   40         banana    2  

我的代码就像

df
Out[23]: 
       Date  Amount    Type
0  20160101      50   apple
1  20160101      50   apple
2  20160101      50  banana
3  20160102      30   apple
4  20160102      50   apple
5  20160102      40  banana
6  20160102      40  banana

P=df.pivot_table('Amount','Date','Type')

P
Out[27]: 
Type      apple  banana
Date                   
20160101     50      50
20160102     40      40

2 个答案:

答案 0 :(得分:1)

这是一个可以帮助你解决问题的黑客攻击。我觉得需要更直接的方式

df['times'] = 1
df.groupby(['Date', 'Amount', 'Type'], as_index=False).sum()

编辑:

找到第二个解决方案(您需要重命名列

df.groupby(['date','type']).amount.value_counts().reset_index()

答案 1 :(得分:1)

>>> df.groupby(['date', 'amount', 'type']).size().reset_index()
       date  amount    type  0
0  20160101      50   apple  2
1  20160101      50  banana  1
2  20160102      30   apple  1
3  20160102      40  banana  2
4  20160102      50   apple  1

或者您可以使用agg

  

如果传递了dict,则键将用于命名列。否则将使用函数的名称(存储在函数对象中)。

df.groupby(['date', 'amount', 'type']).type.agg({'times': 'size'}).reset_index()
       date  amount    type  times
0  20160101      50   apple      2
1  20160101      50  banana      1
2  20160102      30   apple      1
3  20160102      40  banana      2
4  20160102      50   apple      1