如何转换Python3 pandas分组计数后DataFrame的表格形态?
解决方法:将分组计数的DataFrame转为宽格式表格
这问题我熟!你要的就是把长格式的分组结果转换成宽格式表格,用Pandas的pivot()或者pivot_table()方法就能轻松搞定,我结合你的示例数据给你一步步演示:
第一步:先得到分组计数后的DataFrame
先把你提供的示例代码跑一遍,拿到分组后的结果:
import pandas as pd df = pd.DataFrame({'x':list('aaabbbbbccccc'),'y':list('2225555577777'), 'z':list('1312223224432')}) # 生成分组计数后的DataFrame df_counts = df.groupby(['x','y','z'])['z'].count().reset_index(name='counts')
方法1:使用pivot()直接转换
pivot()是最直接的方式,指定行索引、列、对应值即可,最后补全缺失值并转成整数类型:
# 转换为宽格式表格 wide_df = df_counts.pivot(index=['x', 'y'], columns='z', values='counts') # 缺失值填充为0,转成整数(因为计数都是整数) wide_df = wide_df.fillna(0).astype(int)
转换后的结果长这样:
| 1 | 2 | 3 | 4 | ||
|---|---|---|---|---|---|
| x | y | ||||
| a | 2 | 2 | 0 | 1 | 0 |
| b | 5 | 0 | 4 | 1 | 0 |
| c | 7 | 0 | 2 | 1 | 2 |
如果觉得列上方的z标签多余,可以去掉:
wide_df = wide_df.rename_axis(columns=None)
方法2:使用pivot_table()(更灵活的方案)
如果你的数据存在重复的(x,y,z)组合(虽然这个示例里没有),pivot_table()会更合适,它支持聚合函数,而且可以直接设置填充值:
wide_df = df_counts.pivot_table( index=['x', 'y'], columns='z', values='counts', fill_value=0, # 直接填充缺失值为0 aggfunc='sum' # 因为每个组合唯一,sum/count都可以 )
这个方法得到的结果和上面完全一致,而且一步到位,不需要额外的fillna操作。
内容的提问来源于stack exchange,提问作者Sezen
相关产品推荐
相关产品推荐

