当前位置: 首页 > 知识库问答 >
问题:

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

长孙硕
2024-07-19

数据:数据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个答案

罗昊明
2024-07-19

当使用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文件,它可能提供更多的格式控制选项。

 类似资料:
  • 现在,我要检索一个值: Q1:在[3.3,6.6]范围内-预期返回值:[3.3,5.5,6.6]或[3.3,3.3,5.5,6.6](包括最后一个),如果没有,则为[3.3,5.5]或[3.3,3.3,5.5]。 Q2:在[2.0,4.0]范围内-预期返回值:[3.3]或[3.3,3.3] 对于任何其他多索引维度都是相同的,例如B值: Q3:在范围[111,500]中有重复,作为范围中的数据行数-

  • 问题内容: 我正在使用CSS属性, 如果我使用=>它会在之前打印一个额外的空白页 如果我使用=>,它将在以后打印额外的空白页。 如何避免这种情况? 问题答案: 您也许可以添加 因此最后一个元素将不会获得额外的分页符。 请注意,如果您以浏览器的目标为目标,则IE8不支持:last-child选择器。

  • 我正在尝试保存一个csv到一个文件夹后,使一些编辑的文件。 每次使用,csv文件都有一个单独的索引列。我想避免将索引打印到CSV。 我试过: 保存文件... 不过,我还是得到了不想要的索引列。当我保存我的文件时,我该如何避免这种情况呢?

  • 我正在尝试根据我的边2[]数组中的对象编写一个新文档。现在不幸的是,这个数组中的一些索引为空,当它击中其中一个时,它只是给了我一个NullPointerExc的。这个数组有10个索引,但在这种情况下并不需要所有的索引。我已经尝试了try的捕捉语句,希望在它遇到空值后继续,但它仍然停止执行,并且不写新文档。作为对象一部分的堆栈(sire)包含我想打印出来的数据。 这是我的代码:

  • 问题内容: 给定一个数据帧字典,例如: 其中每个数据框具有相同的列和相似的索引,例如: 最简单的方法是将所有数据帧组合成一个,并具有如下所示的多索引: 我尝试了几种方法-例如,对于每个数据框,使用多索引之类替换列,然后将其串联,但没有成功。 问题答案: 您可以使用(参数将创建层次结构列索引)执行此操作: 确实需要列表,因此以下等效:

  • 问题内容: 我可以在熊猫的特定列索引处插入列吗? 这会将列作为的最后一列,但是没有办法告诉它放在开始处吗? 问题答案: 参见文档:http : //pandas.pydata.org/pandas- docs/stable/genic/pandas.DataFrame.insert.html 使用loc = 0将在开头插入