使用Pandas读取Excel:将多行合并为列标题(数据始于第7行)
解决Pandas读取Excel时多行列名合并问题
核心思路
你的列名分散在多行,直接用header或skiprows只能指定单行列名,需要先读取包含列名行的全表,手动合并多行内容作为列名,再提取实际数据。
具体代码实现
import pandas as pd from collections import defaultdict # 1. 读取整个Excel文件,不指定表头,所有行都作为数据加载 df_raw = pd.read_excel("sample.xlsx", header=None) # 2. 定义列名所在的行索引(替换成你实际的列名行,比如列名在Excel的第1-6行,对应索引0-5) header_row_indices = [0, 1, 2, 3, 4, 5] # 3. 合并每一列的多行表头内容,自动忽略空值 new_columns = [] for col_idx in df_raw.columns: # 提取当前列的所有表头行内容,过滤空值后拼接 header_parts = [ str(part).strip() for part in df_raw.loc[header_row_indices, col_idx] if pd.notna(part) and str(part).strip() != "" ] new_columns.append(" ".join(header_parts)) # 4. 提取实际数据行(从第7行开始,对应索引6) df = df_raw.loc[6:, :].copy() # 5. 处理可能的重复列名,添加后缀区分 col_counter = defaultdict(int) final_columns = [] for col_name in new_columns: col_counter[col_name] += 1 if col_counter[col_name] > 1: final_columns.append(f"{col_name}_{col_counter[col_name]}") else: final_columns.append(col_name) # 6. 设置最终列名并重置索引 df.columns = final_columns df = df.reset_index(drop=True)
代码说明
- 步骤2的
header_row_indices需要根据你的实际Excel调整:比如列名在Excel的第4-6行(界面显示的行号),对应pandas的索引是3、4、5,就把列表改成[3,4,5]。 - 合并表头时自动过滤空值,避免拼接无效空字符串。
- 步骤5处理重复列名,防止后续数据操作因列名重复报错。
内容的提问来源于stack exchange,提问作者Bits
相关产品推荐
相关产品推荐

