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

我想将multi-header数据框保存为Excel文件。以下是示例代码:

import pandas as pd
import numpy as np

header = pd.MultiIndex.from_product([['location1','location2'],
                                     ['S1','S2','S3']],
                                    names=['loc','S'])

df = pd.DataFrame(np.random.randn(5, 6), 
                  index=['a','b','c','d','e'], 
                  columns=header)

df.to_excel('result.xlsx')

excel文件中有两个问题,如下所示:

Issue 1:

标题下有一个空行。请告诉我如何避免Pandas在Excel文件中写入/插入空行。

Issue 2:

我想保存没有索引的数据帧。但是,当我设置index=False时,我得到以下错误:

 df.to_excel('result.xlsx', index=False)

Error:

NotImplementedError: Writing to Excel with MultiIndex columns and no index ('index'=False) is not yet implemented.

这是因为pandas不支持多级索引导出到excel时的隐藏索引。以下为几种解决方案:

1、可以创建两个Dataframes-only标头和默认标头,并使用startrow参数将两者写入同一工作表:

header = df.columns.to_frame(index=False)
header.loc[header['loc'].duplicated(), 'loc'] = ''
header = header.T
print (header)
             0   1   2          3   4   5
loc  location1          location2        
S           S1  S2  S3         S1  S2  S3


df1 = df.set_axis(range(len(df.columns)), axis=1)
print (df1)
          0         1         2         3         4         5
a -1.603958  1.067986  0.474493 -0.352657 -2.198830 -2.028590
b -0.989817 -0.621200  0.010686 -0.248616  1.121244  0.727779
c -0.851071 -0.593429 -1.398475  0.281235 -0.261898 -0.568850
d  1.414492 -1.309289 -0.581249 -0.718679 -0.307876  0.535318
e -2.108857 -1.870788  1.079796  0.478511  0.613011 -0.441136

with pd.ExcelWriter('output.xlsx') as writer:  
    header.to_excel(writer, sheet_name='Sheet_name_1', header=False, index=False)
    df1.to_excel(writer, sheet_name='Sheet_name_1', header=False, index=False, startrow=2)

2、

一个解决方案是在导出之前重置行索引,但在写入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文件,它可能提供更多的格式控制选项。

3、保存excel后,删除到行索引所在行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值