使用pandas在数据框中出现值的频率

时间:2016-03-10 23:12:05

标签: python pandas dataframe

我有以下数据框syntax

syntax

我想计算每个用户显示值df1的频率,并将此值放在新列中。我想得到以下数据框:

 id | action | 
----|--------|
 1  | A      | 
 1  | A      | 
 2  | C      | 
 3  | D      |
 2  | B      |
 2  | C      |   
 1  | B      | 
 3  | D      | 
 1  | D      |
 3  | A      |  

2 个答案:

答案 0 :(得分:2)

首先,您应该添加其他列Count,其值为1

df['Count'] = 1
df
id  action  Count
0   1   A   1
1   1   A   1
2   2   C   1
3   3   D   1
4   2   B   1
5   2   C   1
6   1   B   1
7   3   D   1
8   1   D   1
9   3   A   1

然后您可以使用pivot_table()来获得所需的结果。

df.pivot_table('Count', index='id', columns='action', aggfunc='sum', fill_value=0)
action  A   B   C   D
id              
1   2   1   0   1
2   0   1   2   0
3   1   0   0   2

答案 1 :(得分:0)

我找到了一个解决方案,但我不喜欢它:

import six
import numpy as np
import pandas as pd

data = """\
id  action  
 1  A       
 1  A       
 2  C       
 3  D      
 2  B      
 2  C         
 1  B       
 3  D       
 1  D      
 3  A        
"""

df = pd.read_csv(six.StringIO(data), sep='\s+')
print(df)

pvt = df.pivot(columns='action', values='id')
pvt['id'] = df['id']
print(pvt.groupby('id').count().reset_index().to_string(index=False))

输出:

   id action
0   1      A
1   1      A
2   2      C
3   3      D
4   2      B
5   2      C
6   1      B
7   3      D
8   1      D
9   3      A
 id  A  B  C  D
  1  2  1  0  1
  2  0  1  2  0
  3  1  0  0  2

PS我希望会有另一个更优雅的