如何在Pandas中转置多值列以重塑DataFrame结构?
Pandas DataFrame转置解决方案
问题分析
你需要完成两个核心转换:
- 将
VL_JAN/VL_FEB等月份列转为行数据,生成MONTHS列 - 将
CD_PRD的不同取值(CD76/CD92)转为单独的数值列(VL_CD76/VL_CD92)
你的原始代码直接使用pivot未先处理月份列的宽转长,导致结构不符合预期,正确步骤需要结合melt和pivot完成。
实现代码
假设你的原始DataFrame名为df2,执行以下代码即可得到目标结构:
import pandas as pd # 1. 宽表转长表:将月份列转为行,提取MONTHS字段 df_melted = df2.melt( id_vars=['YEAR', 'CD_PRD'], # 保留作为标识的列 value_vars=['VL_JAN', 'VL_FEB', 'VL_MAR', 'VL_APR'], # 需要转为行的月份列 var_name='MONTHS', # 新生成的月份列名 value_name='VALUE' # 对应数值的列名 ) # 去除MONTHS列的"VL_"前缀 df_melted['MONTHS'] = df_melted['MONTHS'].str.lstrip('VL_') # 2. 长表转宽表:将CD_PRD的取值转为单独列 df_result = df_melted.pivot( index=['YEAR', 'MONTHS'], # 作为行索引的列 columns='CD_PRD', # 转为列的字段 values='VALUE' # 填充的数值 ).reset_index() # 重命名列,添加"VL_"前缀 df_result.columns = ['YEAR', 'MONTHS', 'VL_CD76', 'VL_CD92'] # 按年份和月份排序,确保结果顺序与目标一致 df_result = df_result.sort_values(by=['YEAR', 'MONTHS']).reset_index(drop=True) print(df_result)
代码说明
melt阶段:把原始宽表中每个月份的列拆分为行,同时保留YEAR和CD_PRD作为数据标识,再通过字符串处理去掉月份名的前缀。pivot阶段:以YEAR和MONTHS为行标识,将CD_PRD的不同取值转为独立列,最后重置索引并调整列名,得到目标结构。
内容的提问来源于stack exchange,提问作者Marcio Lino
相关产品推荐
相关产品推荐

