Pandas处理无顶层列名的DataFrame:层级列名填充与拼接实现
Pandas双层空顶层列名规整实现方案
针对导入带合并单元格表格生成的双层空顶层列结构,可按照以下两步完成列名规整,完全匹配业务需求:
操作步骤
第一步:填充空白顶层列
- 从原始MultiIndex双层列中拆分出顶层、子列两个独立的取值序列
- 对顶层取值序列执行向前填充(ffill):空白位置自动继承左侧最近的非空顶层列名,直接匹配合并单元格的跨列归属关系,不需要手动逐一对应
该填充逻辑完全对应需求要求的“空白顶层列替换为相邻左侧最近的非空顶层列名”,不会出现跨分组错配
第二步:拼接生成扁平化复合列名
- 将填充完成的顶层值与原有子列值逐列配对拼接:
- 无下挂子列的独立列(如Sr No、Description、Qty),因为原本的子列值为空,直接保留原顶层列名,避免出现带尾下划线的无效列名
- 有下挂子列的分组列,使用下划线连接顶层列名与子列名,例如
ABC Ltd_W/O Tax
- 将拼接完成的列名序列直接赋值给DataFrame的
columns属性,即可得到规整的单层列结构
可直接运行的代码示例
import pandas as pd # 构造与题目场景完全一致的双层测试列结构 multi_cols = pd.MultiIndex.from_tuples([ ("Sr No", ""), ("Description", ""), ("Qty", ""), ("ABC Ltd", ""), ("", "W/O Tax"), ("", "W/ Tax"), ("XYZ Ltd", ""), ("", "W/O Tax"), ("", "W/ Tax") ]) # 生成带模拟业务数值的测试DataFrame df = pd.DataFrame( data=[[1, "内六角螺丝M6", 100, 500, 565, 800, 904, 2, "防滑螺母M8", 200, 1200, 1356, 1800, 2034]], columns=multi_cols ) # 执行列名规整 # 1. 拆分双层列 top_vals = df.columns.get_level_values(0).tolist() sub_vals = df.columns.get_level_values(1).tolist() # 2. 向前填充空白顶层列 filled_top_vals = pd.Series(top_vals).ffill().tolist() # 3. 拼接最终列名 final_cols = [] for top, sub in zip(filled_top_vals, sub_vals): final_cols.append(top if sub == "" else f"{top}_{sub}") # 替换为单层列名 df.columns = final_cols
实操踩坑提醒
- 必须使用向前填充逻辑处理空白顶层列,不可用全局空值填充规则,否则会把公司分组的列名错配到其他分组下
- 拼接列名时必须判断子列值是否为空,否则独立列会生成类似
Sr No_的无效列名,影响后续数据筛选 - 该方案可直接适配通过
pd.read_excel(..., header=[0,1])导入的带合并单元格的业务表格,不需要手动写映射规则
内容的提问来源于stack exchange,提问作者pythondumb
相关产品推荐
相关产品推荐

