如何在导出到Excel时处理Pandas DataFrame的多级列索引,避免空白行和列?

数据:数据df是dataframe类型,并且包含多个dataframe类型子数据,他们的列名都是两级,将df导出到Excel的默认工作簿中后,发现表中第三行和第一列都是空白的,其实就是dataframe的列索引和行索引。
问题:导出数据后,再加载Excel删去行、列索引,发现表中多级列名中的第一级列名合并单元格都失效了,并且只显示第一个子数据的第一级列名
df的数据代码:

# 创建新Excel文件并将数据写入 使用两级列索引作为标题
df_weather.to_excel(excel_file, header=[0, 1])
#  加载Excel
workbook = load_workbook(excel_file)
# # 获取默认的工作表,一般是第一个
sheet = workbook.active
# 删除第一列(A列)
sheet.delete_cols(1)
# 删除第三行
sheet.delete_rows(3)
# 保存修改后的工作簿
workbook.save(excel_file)
print(f"Excel 文件 {excel_file} 中的第一列和第三行数据已成功删除")
# 关闭工作簿
workbook.close()

使用 to_excel() 方法将带有 多级列索引 (MultiIndex columns) 的 DataFrame 导出到 Excel 时,如果同时设置了 index=False 去掉行索引,但是报错 “NotImplementedError: Writing to Excel with MultiIndex columns and no index (‘index’=False) is not yet implemented”后来查找发现该方法不支持多级列索引去掉行索引
想要的效果:效果图
实际执行结果:

阅读 1.2k
avatarAI BotBETA

当使用Pandas的to_excel方法导出带有多级列索引(MultiIndex columns)的DataFrame到Excel时,默认情况下它会包含行索引(除非明确设置index=False),但正如你提到的,当存在多级列索引时,index=False可能不被支持。

为了避免空白行和列,并且保持多级列索引的格式,你可以使用ExcelWriterto_excel方法的indexheader参数。但是,由于index=False在多级列索引中可能不被支持,你需要找到另一种方法来避免行索引被写入。

一个解决方案是在导出之前重置行索引,但在写入Excel时保留多级列索引。这里是一个如何做到这一点的例子:

import pandas as pd
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows

# 假设df_weather是你的DataFrame,并且它有一个多级列索引
# 重置行索引,但保留列索引
df_reset = df_weather.reset_index()

# 导出到Excel,不写入行索引,但保留多级列索引
with pd.ExcelWriter(excel_file, engine='openpyxl') as writer:
    df_reset.to_excel(writer, sheet_name='Sheet1', index=False, header=df_reset.columns.nlevels)

# 如果你需要进一步修改Excel文件(比如合并单元格),那么需要加载它
workbook = load_workbook(excel_file)
sheet = workbook.active

# 如果你需要合并某些单元格,你可以在这里添加代码(但通常不需要,因为多级列索引应该已经正确处理)

# 保存修改后的工作簿
workbook.save(excel_file)
workbook.close()

注意,在to_excel中,我设置了header=df_reset.columns.nlevels,它表示列标题的行数应该等于列索引的级别数。然而,在大多数情况下,这应该是自动处理的,因为Pandas会尝试正确地写入多级列索引。

此外,请注意,在Excel中合并单元格可能会导致数据对齐或格式问题,特别是在加载回Pandas或其他数据分析工具时。因此,通常不建议在导出到Excel时合并单元格,除非有明确的业务需求。

在你的情况下,如果你发现多级列索引没有正确地合并单元格,可能是Excel本身的问题或Excel版本与openpyxl库的兼容性问题。确保你使用的openpyxl库与你的Excel版本兼容,并考虑升级到最新版本。如果问题仍然存在,你可能需要手动在Excel中调整单元格格式,或者考虑使用其他库(如xlsxwriter)来导出Excel文件,它可能提供更多的格式控制选项。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏