You need to enable JavaScript to run this app. 多重索引DataFrame列合并:产品单列化与价格列独立拆分实现
优惠活动
大模型
产品
解决方案
定价
更多

多重索引DataFrame列合并:产品单列化与价格列独立拆分实现

多重索引DataFrame结构转换实现方案

核心转换逻辑

本质是将原本嵌套在列层级的产品名称、价格维度进行层级拆解,把原本分布在列上的产品条目抽离为独立列,不同价格维度单独保留为列,全程依赖pandas自带的多重索引操作完成,不需要手动写循环匹配。

可复现操作步骤

  1. 先模拟和现有结构一致的测试数据集,确保代码可以直接复现调整:
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=["无实际业务含义的占位行索引"]
)
  1. 执行核心结构转换
# 对列层级做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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 01:54:05