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

如何将宽格式DataFrame转换为指定长格式?求技术帮助

解决宽格式DataFrame转长格式(年份随月份重复)

场景模拟与解决方案

假设你的宽格式DataFrame结构如下(以年份为列、月份为标识列为例):

import pandas as pd

# 模拟宽格式数据
wide_df = pd.DataFrame({
    "月份": [1, 2, 3, 4, 5, 6],
    "2020": [100, 120, 110, 130, 140, 125],
    "2021": [150, 160, 155, 170, 180, 165],
    "2022": [200, 220, 210, 230, 240, 225]
})

使用melt方法可以直接实现需求,核心是指定保留的标识列、原列名转换后的列名、原单元格值的列名:

# 转换为长格式
long_df = wide_df.melt(
    id_vars=["月份"],  # 保留作为分组标识的列
    var_name="年份",   # 原年份列名转为"年份"列
    value_name="数值"  # 原单元格数据转为"数值"列
)

# 可选:将年份列转为整数类型(若原列名为字符串格式)
long_df["年份"] = long_df["年份"].astype(int)

# 可选:按年份+月份排序
long_df = long_df.sort_values(["年份", "月份"]).reset_index(drop=True)

转换后的长格式效果:

月份年份数值
012020100
122020120
232020110
342020130
452020140
562020125
612021150
............

特殊结构适配

如果你的宽格式是年份为行索引、月份为列,只需先重置索引再执行melt:

# 模拟行索引为年份的宽格式
wide_df = pd.DataFrame({
    "1月": [100, 150, 200],
    "2月": [120, 160, 220]
}, index=[2020, 2021, 2022])

# 重置索引转年份为列,再转换长格式
wide_df = wide_df.reset_index().rename(columns={"index": "年份"})
long_df = wide_df.melt(id_vars=["年份"], var_name="月份", value_name="数值")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 18:57:40