使用Pandas处理Excel时保留首3行表头/筛选信息的问题
解决Excel筛选后保留前3行表头/筛选信息的问题
问题分析
原代码的核心问题是使用pd.read_excel()默认参数读取文件时,会把Excel的第一行当作DataFrame的列名,导致前3行的表头信息和后续数据的列结构不匹配,拼接后导出的Excel格式混乱。
解决方案
正确的做法是先完整读取所有行(不指定表头),拆分出表头信息、数据列名和数据行,筛选后再按原结构拼接:
修改后的代码
import pandas as pd # 读取整个Excel,不设置表头,所有行都作为数据行保留 self.original_data = pd.read_excel('original-data.xlsx', header=None) # 拆分出前3行的表头/筛选信息 header_rows = self.original_data.iloc[:3] # 数据列名行(第4行,索引为3) data_columns = self.original_data.iloc[3:4] # 原始数据行(从第5行开始,索引4及以后) raw_data = self.original_data.iloc[4:] # 给原始数据设置列名 raw_data.columns = self.original_data.iloc[3].tolist() # 执行数据筛选 filtered_data = raw_data[raw_data[self.filter_column].isin(self.filtered_list)] # 按原格式拼接:表头行 + 数据列名行 + 筛选后的数据 final_data = pd.concat([header_rows, data_columns, filtered_data], ignore_index=True) # 导出Excel,不保留索引,也不自动添加列名(因为我们已经手动包含了列名行) final_data.to_excel('filtered_data/new-data.xlsx', sheet_name='Yay', index=False, header=False)
关键说明
header=None:确保读取Excel时不将任何行当作DataFrame的列名,完整保留所有原始行。- 拆分后分别处理表头、列名和数据:避免结构冲突,保证拼接后的格式和原文件一致。
- 导出时设置
header=False:因为我们已经把数据列名行作为普通行包含在final_data里了,不需要pandas自动生成列名。
内容的提问来源于stack exchange,提问作者William
相关产品推荐
相关产品推荐

