计算Pandas中条件行的值频率

时间:2017-03-13 22:43:27

标签: python pandas dataframe count pandas-groupby

我有一个数据帧df,如:

Name   title freq
A       k1  1
A       k1  1
A       k1  2
A       k1  2
A       k1  2
M       k1  1
M       k1  1
M       k1  1
M       k1  2
M       k1  2
M       k1  2
M       k1  2
A       k2  1
A       k2  1
A       k2  1
A       k2  2
A       k2  2
A       k2  2
A       k2  2
M       k2  1
M       k2  1
M       k2  1
M       k2  1
M       k2  1
M       k2  2
M       k2  2
M       k2  2
M       k2  2
M       k2  2
M       k2  2

我想创建一个输出:

title name  freq_1  freq_2
k1    A      2         3
k1    M      3         4
k2    A      3         4
k2    M      5         6

我试过了:     df.groupby([' title',' name',' freq'])。size()。reset_index(name =' Number' )

并且输出与我想要的有点不同:

      title    name            freq   Number
0        k1     A               1       2
1        k1     A               2       3
2        k1     M               1       3
3        k1     M               2       4
4        k2     A               1       3
5        k2     A               2       4
6        k2     M               1       5
7        k2     M               2       6

2 个答案:

答案 0 :(得分:5)

您可以使用pd.crosstab

(pd.crosstab([df.Name, df.title], df.freq, colnames=[''])
   .rename(columns="freq_{}".format).reset_index())

enter image description here

答案 1 :(得分:5)

快速回答

df.groupby(['Name', 'title', 'freq']).size().unstack()

freq        1  2
Name title      
A    k1     2  3
     k2     3  4
M    k1     3  4
     k2     5  6

进行更多格式化

df.groupby(['Name', 'title', 'freq']).size().unstack() \
  .rename(columns='freq_{}'.format).rename_axis(None, 1).reset_index()

  Name title  freq_1  freq_2
0    A    k1       2       3
1    A    k2       3       4
2    M    k1       3       4
3    M    k2       5       6