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
相关产品推荐
相关产品推荐

