多重索引DataFrame列合并:产品单列化与价格列独立拆分实现
多重索引DataFrame结构转换实现方案
核心转换逻辑
本质是将原本嵌套在列层级的产品名称、价格维度进行层级拆解,把原本分布在列上的产品条目抽离为独立列,不同价格维度单独保留为列,全程依赖pandas自带的多重索引操作完成,不需要手动写循环匹配。
可复现操作步骤
- 先模拟和现有结构一致的测试数据集,确保代码可以直接复现调整:
import pandas as pd import numpy as np # 模拟列带两层多重索引的原始数据 # 列第一层为不同价格维度,列第二层为对应产品,刻意打乱产品顺序匹配你描述的场景 col_arrays = [ ["日常售价", "日常售价", "日常售价", "日常售价", "大促售价", "大促售价", "大促售价", "大促售价", "渠道供货价", "渠道供货价", "渠道供货价", "渠道供货价"], ["笔记本电脑", "机械键盘", "无线鼠标", "办公显示器", "无线鼠标", "办公显示器", "机械键盘", "笔记本电脑", "机械键盘", "笔记本电脑", "无线鼠标", "办公显示器"] ] # 生成原始DataFrame,带无意义的空行索引匹配你提到的实际数据特征 df_raw = pd.DataFrame( np.random.randint(200, 12000, size=(1, 12)), columns=pd.MultiIndex.from_arrays(col_arrays), index=["无实际业务含义的占位行索引"] )
- 执行核心结构转换
# 对列层级做stack操作:把原列第一层的价格维度转为普通列,原列第二层的产品名转为行索引 df_step1 = df_raw.stack(level=0) # 把行索引里的产品名抽离为单独的普通列,清理多余的占位行 df_final = ( df_step1 .reset_index(level=0, drop=True) # 删除无意义的占位行索引 .rename_axis("产品名称") # 给行索引设置明确名称 .reset_index() # 把产品名从行索引转成普通列 .dropna(axis=1, how="all") # 清理转换后产生的全空列 )
常见适配调整
- 如果你的实际数据中,多重索引列的两层顺序和模拟场景相反(即第一层是产品名、第二层是价格维度),只需要把
stack(level=0)里的参数改成level=1即可,其余逻辑不变 - 因为产品集合完全一致,pandas会自动按照产品名做对齐匹配,哪怕原始列上的产品顺序是乱的,也不会出现价格和产品错位的问题
- 如果转换后出现多余的全空行,可追加
.dropna(axis=0, how="all")清理
转换后结构说明
最终输出的结构和你期望的目标完全一致:
- 单独一列存所有产品的完整名称,无重复、无错位
- 每一个价格维度单独作为独立列,存储对应产品的匹配价格
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

