Python Pandas透视表统计频次:无需虚拟列的优雅实现方案
问题解答
为什么第二种方法出错?
当你调用df.pivot_table(index='id', columns='type', aggfunc='count')时,因为没有指定values参数,pandas会自动筛选不属于行索引(index)和列索引(columns)的其他列作为统计对象。但你的原DataFrame只有id和type两列:id被设为行索引,type被设为列索引,没有剩余的列可以用来执行计数聚合,所以最终返回的结果只有行索引,没有数值列。
无需新增虚拟列的优雅实现方式
这里提供几种简洁的实现方法:
方法1:使用pd.crosstab(最直接)
crosstab是pandas专门为交叉频数统计设计的函数,一行代码就能得到目标结果:
import pandas as pd pd.crosstab(df['id'], df['type'])
方法2:给pivot_table指定values参数
只需要指定任意一个现有列作为values(比如type或id),配合count聚合即可,还能通过fill_value补全缺失的计数:
df.pivot_table(index='id', columns='type', values='type', aggfunc='count', fill_value=0)
方法3:groupby + value_counts + unstack
通过分组后统计值频率,再转成宽格式:
df.groupby('id')['type'].value_counts().unstack(fill_value=0)
内容的提问来源于stack exchange,提问作者J-H
相关产品推荐
相关产品推荐

