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

如何将单索引DataFrame的列标题转换为MultiIndex?

解决方法

1. 将单索引列转换为两级MultiIndex

核心是把合并的列标题拆分成两个层级,用pd.MultiIndex.from_tuples()生成多级索引:

代码示例

import pandas as pd

# 导入csv数据(假设行分组列名为"家具类型_年份")
df_mix = pd.read_csv("your_data.csv", index_col="家具类型_年份")

# 拆分列名(以下划线为分隔符,根据实际格式修改)
df_mix.columns = pd.MultiIndex.from_tuples(
    [col.split("_") for col in df_mix.columns],
    names=["大小", "颜色"]  # 指定两级索引的名称
)

执行后即可得到类似df_multi的两级列索引结构。

2. 扁平化数据得到整洁格式

用stack()将颜色层级从列转为行,再整理索引与列顺序:

# 扁平化颜色列
st1 = df_mix.stack(level="颜色").reset_index()

# 拆分行索引的分组信息
st1[["家具类型", "年份"]] = st1["家具类型_年份"].str.split("_", expand=True)

# 调整列顺序并重命名数值列
st1 = st1.drop("家具类型_年份", axis=1)
st1 = st1.reindex(columns=["家具类型", "年份", "大小", "颜色", 0])
st1.rename(columns={0: "数量"}, inplace=True)

替代方案:直接用melt()(无需转MultiIndex)

如果不想生成多级索引,可直接通过melt()拆分列名:

df_mix = pd.read_csv("your_data.csv")

# 宽格式转长格式
st1_melt = df_mix.melt(
    id_vars="家具类型_年份",
    var_name="大小_颜色",
    value_name="数量"
)

# 拆分大小与颜色、家具类型与年份
st1_melt[["大小", "颜色"]] = st1_melt["大小_颜色"].str.split("_", expand=True)
st1_melt[["家具类型", "年份"]] = st1_melt["家具类型_年份"].str.split("_", expand=True)

# 清理冗余列并调整顺序
st1_melt = st1_melt.drop(["家具类型_年份", "大小_颜色"], axis=1)
st1_melt = st1_melt.reindex(columns=["家具类型", "年份", "大小", "颜色", "数量"])

注意事项

  • 替换split("_")中的分隔符为你实际列名的分隔符(如空格、连字符等)
  • 若列名格式不规则,可用正则表达式拆分:str.extract(r"(.+)_(.+)")
  • 导入csv时,若行分组是单独的多列而非合并列,无需设置index_col

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 16:20:33