如何将多层列索引的多个Pandas DataFrame导出为长格式单页Excel
实现方案
核心思路是把每个DataFrame独有的主题标识从列索引转移为行索引层级,再纵向拼接所有数据,避免列过宽。
操作步骤
- 遍历每个DataFrame,提取独有的第一级列索引(主题名)
- 移除每个DataFrame列的第一级索引,保留所有df统一的后两级列索引
- 将主题名作为新的行索引层级添加到对应DataFrame
- 纵向拼接所有处理后的DataFrame,导出Excel
完整可运行代码
import pandas as pd df1 = pd.DataFrame({'A': [11, 21, 31], 'B': [12, 22, 32], 'C': [13, 23, 33]}, index=['ONE', 'TWO', 'THREE']) df2 = pd.DataFrame({'A': [111, 211, 311], 'B': [121, 221, 321], 'C': [131, 231, 331]}, index=['ONE', 'TWO', 'THREE']) df1.columns = pd.MultiIndex.from_product([['theme1'],['level2'],df1.columns ]) df2.columns = pd.MultiIndex.from_product([['theme2'],['level2'],df2.columns ]) list_df=[df1,df2] # 新增处理逻辑 processed_list = [] for df in list_df: # 提取当前df的主题名 theme_name = df.columns.get_level_values(0).unique()[0] # 移除列的第一级索引(主题层) df.columns = df.columns.droplevel(0) # 将主题名添加为行索引的最外层 df = pd.concat([df], keys=[theme_name], names=['主题']) processed_list.append(df) # 纵向拼接 df_all = pd.concat(processed_list, axis=0) # 导出Excel df_all.to_excel('df_all_long.xlsx')
输出效果
导出的Excel行索引从外到内依次为主题、原行索引(ONE/TWO/THREE),列统一为level2下的A/B/C,所有主题数据纵向排列,直接纵向滚动即可浏览全部内容,不会出现横向列过宽的问题。
内容的提问来源于stack exchange,提问作者rpb
相关产品推荐
相关产品推荐

