You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:Pandas清洗含NaN非结构化销售数据,合并表头与数值行

解决方案:非结构化销售数据合并清洗

核心思路

把前两行的Ship Mode和Segment作为多级列名,再通过堆叠操作将维度信息与对应价格合并为单行,替代低效的循环判断。

具体步骤(基于Pandas)

假设你的原始数据已读入DataFramedf,按以下步骤处理:

  1. 填充第一行的NaN值(整合你已完成的操作)
import pandas as pd

# 填充第一行的NaN,保证Ship Mode信息连续
df.iloc[0] = df.iloc[0].ffill()
  1. 将前两行设置为多级列名
    把Ship Mode(第一行)和Segment(第二行)组合成列的层级信息,第三行及以下为实际价格数据:
# 从第一、二行生成多级列名
multi_cols = pd.MultiIndex.from_arrays([df.iloc[0], df.iloc[1]])
# 提取第三行及以后的价格数据,并设置新列名
price_data = df.iloc[2:]
price_data.columns = multi_cols
  1. 堆叠数据,合并维度与价格
    通过stack操作将列维度转为行,自动过滤NaN价格:
# 堆叠多级列,得到每行对应一组Ship Mode、Segment、Price
result = price_data.stack([0, 1]).reset_index()
# 重命名列名
result.columns = ['原行号', 'Ship Mode', 'Segment', 'Price']
# 移除不需要的原行号列,保留有效数据
final_result = result.drop('原行号', axis=1).dropna(subset=['Price'])

效果验证

比如你的原始简化数据:

NaNSecond ClassNaNStandard Class
NaNConsumerNaNCorporate
Price1NaNPrice2NaN

处理后得到预期的合并行:

Ship ModeSegmentPrice
Second ClassConsumerPrice1
Standard ClassCorporatePrice2

为什么循环判断没达到预期?

循环逐行逐列处理时,容易遗漏跨列的维度关联(比如第一行ffill后的Ship Mode需要和第二行的Segment一一对应),而Pandas的多级索引+堆叠操作是原生支持这种结构化转换的,逻辑更严谨且效率更高。

内容的提问来源于stack exchange,提问作者DE clean

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:22:46