如何将单索引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
相关产品推荐
相关产品推荐

