Pandas中DataFrame操作与聚合:生成指定格式计数聚合表
如何将分组计数结果转换为指定格式的透视表DataFrame?
问题背景
你有如下原始DataFrame:
import pandas as pd dfdict = {'letter': ['a', 'a', 'a', 'b', 'b'], 'category': ['foo', 'foo', 'bar', 'bar', 'spam']} df1 = pd.DataFrame(dfdict)
它的结构是:
category letter 0 foo a 1 foo a 2 bar a 3 bar b 4 spam b
你希望生成按category为行、letter为列的计数表:
a b foo 2 0 bar 1 1 spam 0 1
你已经通过df1.groupby(['category','letter']).size()得到了分组计数的结果:
category letter bar a 1 b 1 foo a 2 spam b 1
现在需要进一步处理得到目标格式。
解决方案
你已经走对了第一步,这里有两种简单的方法可以帮你快速拿到想要的结果:
方法一:基于已有分组结果转换
你得到的多级索引计数结果,只需要用unstack()把内层索引转成列,再用fill_value=0填充缺失的计数即可:
# 先获取分组计数 counts = df1.groupby(['category','letter']).size() # 转换为宽表并填充0 result = counts.unstack(fill_value=0) print(result)
运行后输出正好是你想要的格式:
a b foo 2 0 bar 1 1 spam 0 1
方法二:一步到位用pivot_table
如果不想先做groupby,可以直接用pivot_table函数,一步生成目标表,逻辑更直观:
result = df1.pivot_table( index='category', # 行索引设置为category columns='letter', # 列索引设置为letter aggfunc='size', # 聚合方式为计数 fill_value=0 # 缺失的计数组合填充为0 )
这个方法的结果和上面完全一致,步骤更简洁。
原理说明
unstack()的作用是把多级索引的内层(这里是letter)转成列,原本不存在的组合(比如foo和b)会显示为NaN,fill_value=0参数能把这些空值直接替换成0。pivot_table是Pandas专门用来生成透视表的工具,直接指定行、列和聚合逻辑,就能快速得到结构化的统计结果,很适合这类行列转换的需求。
内容的提问来源于stack exchange,提问作者Liquidity
相关产品推荐
相关产品推荐

