使用Pandas处理数据时如何保留复杂Excel表头格式?
解决特殊格式Excel表头解析问题
核心问题分析
- 语法错误引发报错:你写的
header=[1:3]是Python语法错误,Pandas的header参数需要传入行索引列表,而非切片表达式,这直接导致了ValueError。 - Unnamed列名问题:U列后的表头显示为
unnamed,是因为Excel表头存在多行合并/空值,Pandas无法自动补全空表头的层级关联。
解决方案(无需手动修改Excel格式)
步骤1:修正表头读取参数
将错误的header=[1:3]改为对应表头行的索引列表(Pandas采用0-based索引)。假设你的表头实际占第2、3行(Excel界面显示的行号),则使用header=[1,2]。
步骤2:合并多级表头并补全空值
读取后通过处理多级表头,将空的上层表头用前一个非空值填充,再合并为单级列名,解决unnamed问题。
完整可运行代码
#!/usr/bin/env python import sys import os import pandas as pd # 读取源文件路径 user_input = input("Enter the path of your source excel file (omit 'C:'): ") # 读取Excel,指定第2、3行为表头(0-based索引1和2) df = pd.read_excel(user_input, sheet_name='PN Projection', header=[1,2]) # 处理多级表头:填充空的上层列名并合并为单级列名 cols_df = pd.DataFrame(df.columns.tolist()) # 向下填充第一列空值,用前一个非空值补全 cols_df[0] = cols_df[0].ffill() # 合并两级表头,空的子表头直接保留父表头 df.columns = cols_df.apply(lambda row: f"{row[0]}_{row[1]}" if pd.notna(row[1]) else row[0], axis=1) # 数据过滤逻辑 df = df[~(df['Item Status'] == 'EOL')] df = df[~(df['Description'].str.contains("XCVR", na=False))] df = df[(df['Description'].str.contains("XC", na=False) | df['Description'].str.contains("Spartan", na=False))] print(df) # 保存过滤后的数据(去掉默认索引) df.to_excel('filtered_data.xlsx', sheet_name='filtered_data', index=False)
关键说明
- 如果你的表头实际占行数不同(比如3行),只需调整
header参数为对应的索引列表,例如header=[0,1,2],再修改表头合并逻辑即可。 - 合并后的列名如果不符合预期,可以根据实际表头结构调整
apply里的拼接规则,比如用空格代替下划线。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

