如何使用Pandas保存DataFrame到Excel时调整表头格式?
Pandas导出Excel时如何修复表头层级错位问题?
你提到用Pandas生成交叉表后导出Excel,出现了Month、Activity、Name表头被拆分到不同列的问题,这其实是因为导出时的索引处理和多层列索引的显示逻辑导致的,Pandas有内置参数可以完美解决这个问题,下面给你两种可行的方案:
方法一:保留Name为行索引(推荐)
你的pd.crosstab已经自动把Name设为行索引了,完全没必要用reset_index把它转成列。只需要在导出时开启单元格合并,Pandas会自动处理多层表头的格式:
import pandas as pd from pandas import DataFrame list_me = [['A','A','A','A','A','B','C','D','D','D','D'], ['TT','TT','UU','UU','UU','UU','UU','TT','TT','TT','TT'], ['5','2','1','1','1','40','10','2','2','2','2'], ['1','1','1','2','3','3','1','2','2','2','1']] df = DataFrame(list_me).transpose() df.columns = ['Name','Activity','Hour','Month'] # 生成交叉表,Name作为行索引 df_tab = pd.crosstab(df.Name, columns=[df.Month, df.Activity], values=df.Hour, aggfunc='sum').fillna(0) # 导出时开启merge_cells,自动合并多层表头的单元格 df_tab.to_excel("output.xlsx", merge_cells=True)
导出后的Excel效果:
- 第一列就是
Name,没有多余的数字索引列 - 表头分为两层:第一层是
Month的不同取值,第二层是对应每个Month的Activity,同个Month下的Activity单元格会自动合并,完全不会出现拆分错位的情况
方法二:将Name转为普通列(按需选择)
如果你确实需要把Name从行索引转成普通列,那导出时要记得去掉默认的数字索引,同时开启单元格合并:
import pandas as pd from pandas import DataFrame list_me = [['A','A','A','A','A','B','C','D','D','D','D'], ['TT','TT','UU','UU','UU','UU','UU','TT','TT','TT','TT'], ['5','2','1','1','1','40','10','2','2','2','2'], ['1','1','1','2','3','3','1','2','2','2','1']] df = DataFrame(list_me).transpose() df.columns = ['Name','Activity','Hour','Month'] df_tab = pd.crosstab(df.Name, columns=[df.Month, df.Activity], values=df.Hour, aggfunc='sum').fillna(0) # 将Name从行索引转为普通列 df_tab.reset_index(level=0, inplace=True) # 导出时设置index=False去掉数字索引,同时开启merge_cells处理表头 df_tab.to_excel("output.xlsx", index=False, merge_cells=True)
这样导出的Excel里,Name是第一列,后面的表头是分层的Month和Activity,格式完全符合你的预期,不会再出现表头拆分的问题。
问题根源说明
你之前的代码之所以出问题,是因为导出时没有设置index=False,Pandas默认把DataFrame的数字索引(0、1、2...)作为第一列,导致Name列被挤到第二列,而多层表头的Month/Activity是跨列显示的,最终就出现了表头和列错位、拆分的情况。加上merge_cells=True是让Pandas自动合并多层表头的单元格,让表头显示更规整。
内容的提问来源于stack exchange,提问作者rpb
相关产品推荐
相关产品推荐

