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

如何将宽格式Pandas DataFrame转换为长格式(表格形式)?

解决宽格式DataFrame转长格式的问题

嘿,我明白你现在的困惑——宽转长确实是pivot的反向操作,在pandas里我们用melt()函数就能轻松搞定!先给你提个小细节:你给出的示例DataFrame里有重复的列名'1/1/2001',创建DataFrame时后面的列会覆盖前面的,我先帮你修正这个问题,再一步步演示转换步骤。

第一步:修正示例DataFrame

先把重复的日期列名调整一下,避免数据丢失:

import pandas as pd

# 修正重复列名,把第二个'1/1/2001'改成'1/1/2001_2'
PPPP = pd.DataFrame({
    '1/1/2001_1': [5,6,7,8,9], 
    '1/1/2001_2':[45,46,47,48,49], 
    '1/2/2001':[15,16,17,18,19], 
    '1/3/2001':[25,26,27,28,29], 
    'Category1':['aa','bb','cc','dd','ee'], 
    'Category2':['XX','YY','ZZ','FF','KK']
})

第二步:用pd.melt()实现宽转长

melt()的核心是指定需要保留的标识列(不参与转换的列)和需要转成行的列:

# 转换为长格式
long_df = pd.melt(
    PPPP,
    id_vars=['Category1', 'Category2'],  # 这两列保持原样,作为每行的标识
    var_name='Date',  # 原来的日期列名会变成这个新列的内容
    value_name='Value'  # 原来日期列对应的值会放到这个新列里
)

转换后的长格式结果

运行上面的代码后,long_df的结构会是这样:

Category1 Category2        Date  Value
0         aa        XX  1/1/2001_1      5
1         bb        YY  1/1/2001_1      6
2         cc        ZZ  1/1/2001_1      7
3         dd        FF  1/1/2001_1      8
4         ee        KK  1/1/2001_1      9
5         aa        XX  1/1/2001_2     45
6         bb        YY  1/1/2001_2     46
...(后续行以此类推)

如果你的原始数据里日期列没有重复,只需要把id_vars和日期列对应调整就行,melt()是处理宽转长最常用的工具,完全对应你要的pivot反向操作~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:25:39