Pandas透视表处理:移除冗余表头与重命名索引
解决Pandas透视表冗余表头问题
我来帮你搞定这个透视表的冗余表头问题!先把你的原始数据构造出来方便测试:
import pandas as pd # 构造你的原始DataFrame data = { 'count': [1544, 226, 1524, 246, 1592, 245], 'event': ['strike', 'defense', 'strike', 'defense', 'strike', 'defense'], 'date': ['2016-11-01', '2016-11-01', '2016-12-01', '2016-12-01', '2017-01-01', '2017-01-01'] } df = pd.DataFrame(data)
问题原因
你遇到的冗余count表头,大概率是因为透视时没有明确指定values参数,导致Pandas自动把所有非索引/列的字段(也就是count)作为上层表头,形成了多层列索引。比如直接写df.pivot(index='date', columns='event'),就会出现这种情况。
解决方法
这里有两种简单方式得到你想要的干净结构:
方法1:透视时明确指定values参数
这是最直接的方式,在pivot里指定要聚合的字段是count,直接生成无冗余表头的透视表:
# 生成目标结构的透视表 pivoted_df = df.pivot(index='date', columns='event', values='count') print(pivoted_df)
输出结果:
event defense strike date 2016-11-01 226 1544 2016-12-01 246 1524 2017-01-01 245 1592
如果想要把date从索引转为普通列,同时去掉列名的event标识,可以再加两步:
pivoted_df = pivoted_df.reset_index().rename_axis(None, axis=1) print(pivoted_df)
最终干净的结构:
date defense strike 0 2016-11-01 226 1544 1 2016-12-01 246 1524 2 2017-01-01 245 1592
方法2:处理已生成的多层表头透视表
如果已经不小心生成了带冗余count表头的透视表,可以用droplevel去掉上层冗余:
# 假设已得到带多层表头的透视表 multi_level_df = df.pivot(index='date', columns='event') # 去掉上层的count表头 multi_level_df.columns = multi_level_df.columns.droplevel(0) # 可选:重置索引并清理列名标识 multi_level_df = multi_level_df.reset_index().rename_axis(None, axis=1) print(multi_level_df)
这样也能得到和方法1完全一致的干净结果。
另外,因为你的数据中每个date+event组合都是唯一的,用pivot_table也能达到同样效果(指定aggfunc='sum'即可,无重复值时sum和默认mean结果一致):
pivoted_df = df.pivot_table(index='date', columns='event', values='count', aggfunc='sum')
内容的提问来源于stack exchange,提问作者Aman Singh
相关产品推荐
相关产品推荐

