求助:Pandas清洗含NaN非结构化销售数据,合并表头与数值行
解决方案:非结构化销售数据合并清洗
核心思路
把前两行的Ship Mode和Segment作为多级列名,再通过堆叠操作将维度信息与对应价格合并为单行,替代低效的循环判断。
具体步骤(基于Pandas)
假设你的原始数据已读入DataFramedf,按以下步骤处理:
- 填充第一行的NaN值(整合你已完成的操作)
import pandas as pd # 填充第一行的NaN,保证Ship Mode信息连续 df.iloc[0] = df.iloc[0].ffill()
- 将前两行设置为多级列名
把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
- 堆叠数据,合并维度与价格
通过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'])
效果验证
比如你的原始简化数据:
| NaN | Second Class | NaN | Standard Class |
|---|---|---|---|
| NaN | Consumer | NaN | Corporate |
| Price1 | NaN | Price2 | NaN |
处理后得到预期的合并行:
| Ship Mode | Segment | Price |
|---|---|---|
| Second Class | Consumer | Price1 |
| Standard Class | Corporate | Price2 |
为什么循环判断没达到预期?
循环逐行逐列处理时,容易遗漏跨列的维度关联(比如第一行ffill后的Ship Mode需要和第二行的Segment一一对应),而Pandas的多级索引+堆叠操作是原生支持这种结构化转换的,逻辑更严谨且效率更高。
内容的提问来源于stack exchange,提问作者DE clean
相关产品推荐
相关产品推荐

