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

Pandas如何重塑DataFrame将索引列取值转换为新列

DataFrame 宽转长重塑实现方案

你需要将列名格式为分类维度_维度取值的宽表转换为长表结构,同时保留原行索引Cat作为行标识列,最简便的实现方式是直接使用pandas内置的wide_to_long方法,不需要手动循环拆分列,哪怕存在十几个分类变量也可以快速适配。


核心实现代码

方式1:手动指定分类维度(适合维度较少的场景)

import pandas as pd

# 构造示例数据
df1 = pd.DataFrame({
    'Cat' : ['V','W', 'X', 'Y', 'Z'],
    'Gender_Male' :   [5, 15, 11, 22, 8],
    'Gender_Female' : [4, 12, 15, 18, 7],
    'Location_london': [4,12, 16, 21, 7], 
    'Location_North' : [2, 7,  4,  9, 4], 
    'Location_South' : [3, 8,  6,  9, 4]  
}).set_index('Cat')

# 转换逻辑
df_result = pd.wide_to_long(
    df1.reset_index(), # 先把行索引Cat转回普通列
    stubnames=['Gender', 'Location'], # 填入所有分类维度名,剩余9个分类变量直接追加到该列表即可
    i='Cat', # 行唯一标识列,即原索引
    j='level', # 存储分类维度取值的列名
    sep='_', # 列名中维度和取值的分隔符
    suffix=r'\w+' # 匹配维度取值的正则规则
).reset_index(names=['Cat', 'level', 'category'])
# 调整列顺序和值列名,匹配目标效果
df_result = df_result[['Cat', 'category', 'level', 0]].rename(columns={0:'count'})

方式2:自动识别分类维度(适合维度较多的场景)

如果分类变量总数多,不想手动逐个罗列维度名,可以自动从原表列名提取前缀,不需要手动维护维度列表:

# 自动从列名提取所有分类维度前缀
stub_list = list({col.split('_')[0] for col in df1.columns})

df_result = pd.wide_to_long(
    df1.reset_index(),
    stubnames=stub_list,
    i='Cat',
    j='level',
    sep='_',
    suffix=r'\w+'
).stack().reset_index(name='count').rename(columns={'level_2':'category'})
# 调整列顺序
df_result = df_result[['Cat', 'category', 'level', 'count']]

输出说明

运行代码后得到的结果和目标结构完全一致:每一行对应一个Cat取值、一个分类维度、一个维度取值以及对应的统计值,所有分类变量会自动拆分为行,不需要额外单独处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 05:57:17