如何将宽格式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)
转换后的长格式效果:
| 月份 | 年份 | 数值 | |
|---|---|---|---|
| 0 | 1 | 2020 | 100 |
| 1 | 2 | 2020 | 120 |
| 2 | 3 | 2020 | 110 |
| 3 | 4 | 2020 | 130 |
| 4 | 5 | 2020 | 140 |
| 5 | 6 | 2020 | 125 |
| 6 | 1 | 2021 | 150 |
| ... | ... | ... | ... |
特殊结构适配
如果你的宽格式是年份为行索引、月份为列,只需先重置索引再执行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
相关产品推荐
相关产品推荐

