You need to enable JavaScript to run this app. Pandas处理无顶层列名的DataFrame:层级列名填充与拼接实现
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.04 01:45:03