如何用Pandas读取表头分散在多行的多级表头Excel文件?
解决Pandas多级表头合并与扁平化问题
针对你提到的Excel多级表头(前3行,部分表头仅存在于第3行)的处理需求,以下是完整的解决方案,能自动将多级表头合并为你需要的扁平化格式:
完整代码实现
import pandas as pd # 读取Excel文件,先不指定表头 df = pd.read_excel('test_3.xlsx', sheet_name='WEEK - 2023', header=None) # 提取前3行作为表头,横向填充空值(处理跨行的表头) header_rows = df.iloc[:3, :].fillna(method='ffill', axis=1) # 创建多级表头 multi_cols = pd.MultiIndex.from_arrays(header_rows.values) df.columns = multi_cols # 移除表头行,保留数据部分 df = df.iloc[3:, :].reset_index(drop=True) # 定义函数:将多级表头的每一层拼接为扁平化列名 def flatten_col_name(col): # 过滤空值,转为小写后用下划线连接 parts = [str(part).strip() for part in col if pd.notna(part)] return '_'.join(parts).lower() # 应用函数,重命名所有列 df.columns = [flatten_col_name(col) for col in df.columns] # 可选:调整数据类型,确保字段格式正确 df['month'] = df['month'].astype(str) df['week'] = df['week'].astype(int) print(df)
代码说明
- 表头填充:用
fillna(method='ffill', axis=1)横向填充空值,让跨行的表头(如PLAN 2023)自动覆盖其下方所有关联列,避免表头缺失。 - 多级表头转扁平化:通过自定义函数
flatten_col_name,将每一列的多级表头拼接为小写、下划线分隔的格式,完美匹配你需要的plan_2023_traffic_per_channel_all样式。 - 数据清理:移除表头行后重置索引,同时可按需调整字段的数据类型,保证后续分析的准确性。
示例数据的输出结果
运行代码后,你的示例数据会生成如下格式的DataFrame:
| month | week | plan_2023_traffic_per_channel_all | plan_2023_traffic_per_channel_red | plan_2023_traffic_per_channel_green | plan_2023_traffic_per_channel_orange | plan_2023_traffic_share_per_channel_red | plan_2023_traffic_share_per_channel_green | plan_2023_traffic_share_per_channel_orange |
|---|---|---|---|---|---|---|---|---|
| jan | 1 | 100 | 50 | 30 | 20 | 50% | 30% | 20% |
内容的提问来源于stack exchange,提问作者sdave
相关产品推荐
相关产品推荐

