计算 Pandas 中条件行中的值频率

counting value frequency in conditional rows in Pandas

我有一个数据框 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

您可以使用 pd.crosstab:

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

快速回答

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