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

如何在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)

代码说明

  1. melt阶段:把原始宽表中每个月份的列拆分为行,同时保留YEAR和CD_PRD作为数据标识,再通过字符串处理去掉月份名的前缀。
  2. pivot阶段:以YEAR和MONTHS为行标识,将CD_PRD的不同取值转为独立列,最后重置索引并调整列名,得到目标结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:52:23