Python pandas pivot_table 统计某列频率

52 投票
5 回答
94209 浏览
提问于 2025-04-17 22:21

我刚开始学习Python的pandas库中的pivot_table功能,想请教一下怎么统计一列中值的出现频率,这一列还和另一列的ID有关。我的数据表(DataFrame)看起来是这样的:

import pandas as pd
df = pd.DataFrame({'Account_number':[1,1,2,2,2,3,3],
                   'Product':['A', 'A', 'A', 'B', 'B','A', 'B']
                  })

我希望输出的结果大概是这样的:

                Product
                A      B
Account_number           
      1         2      0
      2         1      2
      3         1      1

到目前为止,我尝试了这段代码:

df.pivot_table(rows = 'Account_number', cols= 'Product', aggfunc='count')

这段代码给我的结果是两个相同的东西。上面的代码有什么问题呢?我之所以问这个问题,是因为这个数据表只是一个例子。我正在处理的真实数据有成千上万的账号。

5 个回答

1

我知道这个问题是关于 pivot_table 的,但对于问题中给出的情况,我们可以用 crosstab 来解决:

out = pd.crosstab(df['Account_number'], df['Product'])

输出结果:

Product         A  B
Account_number      
1               2  0
2               1  2
3               1  1
4

你可以使用 count 这个功能:

df.pivot_table(index='Account_number', columns='Product', aggfunc='count')
19

在新版本的Pandas中,需要做一些小改动。我花了一些时间才搞明白,所以想把这个信息放在这里,方便其他人直接使用。

df.pivot_table(index='Account_number', columns='Product', aggfunc=len,
               fill_value=0)
47

解决方案:使用 aggfunc='size'

如果你用 aggfunc=lenaggfunc='count',就像这个页面上其他答案提到的那样,这在有超过三列的DataFrame中是行不通的。默认情况下,pandas会把这个 aggfunc 应用到所有不在 indexcolumns 参数中的列。

举个例子,如果我们的原始DataFrame多了两列,定义如下:

df = pd.DataFrame({'Account_number':[1, 1, 2 ,2 ,2 ,3 ,3], 
                   'Product':['A', 'A', 'A', 'B', 'B','A', 'B'], 
                   'Price': [10] * 7,
                   'Quantity': [100] * 7})

输出:

   Account_number Product  Price  Quantity
0               1       A     10       100
1               1       A     10       100
2               2       A     10       100
3               2       B     10       100
4               2       B     10       100
5               3       A     10       100
6               3       B     10       100

如果你把当前的解决方案应用到这个DataFrame上,你会得到以下结果:

df.pivot_table(index='Account_number',
               columns='Product',
               aggfunc=len,
               fill_value=0)

输出:

                  Price    Quantity   
Product            A  B        A  B
Account_number                     
1                  2  0        2  0
2                  1  2        1  2
3                  1  1        1  1

解决方案

所以,应该使用 aggfunc='size'。因为 size 对每一列返回的数字都是一样的,pandas就不会对每一列都调用它,而是只调用一次。

df.pivot_table(index='Account_number', 
               columns='Product',
               aggfunc='size',
               fill_value=0)

输出:

Product         A  B
Account_number      
1               2  0
2               1  2
3               1  1
53

你需要把 aggfunc 设置为 len

In [11]: df.pivot_table(index='Account_number', columns='Product', 
                        aggfunc=len, fill_value=0)
Out[11]:
Product         A  B
Account_number
1               2  0
2               1  2
3               1  1

看起来 count 是在计算每一列(Account_numberProduct)的实例数量,但我不太确定这是不是个错误……

撰写回答