Python pandas pivot_table 统计某列频率
我刚开始学习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=len
或 aggfunc='count'
,就像这个页面上其他答案提到的那样,这在有超过三列的DataFrame中是行不通的。默认情况下,pandas会把这个 aggfunc
应用到所有不在 index
或 columns
参数中的列。
举个例子,如果我们的原始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_number
和 Product
)的实例数量,但我不太确定这是不是个错误……