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

如何在Pandas DataFrame中固定起始列并转置指定列?

Pandas实现固定列转置日期列的解决方案

嘿,我懂你要做的事儿——把宽格式的DataFrame转成长格式,固定Type和Class这两列,把那些日期列拆成Date和Value对吧?你之前用pivot其实搞反方向啦,pivot是用来把长表转宽表的,而你需要的宽表转长表,Pandas里的melt函数刚好是干这个活的利器!

第一步:先还原你的输入DataFrame

先把你给出的示例数据用代码构造出来,方便你直接测试:

import pandas as pd

# 构造输入的宽格式DataFrame
data = {
    'Type': ['Plant1', 'Plant2', 'Veg1', 'Veg2'],
    'Class': ['Plant', 'Plant', 'Vegetable', 'Vegetable'],
    '24/01/2018': [5498, 3416, 5426, 5317],
    '25/01/2018': [5998, 4844, 5464, 4616],
    '26/01/2018': [5815, 4991, 3756, 7528]
}
df = pd.DataFrame(data)

第二步:用melt实现需求

直接调用pd.melt,参数设置非常直观:

# 使用melt转换格式
result_df = df.melt(
    id_vars=['Type', 'Class'],  # 保持固定不转置的列
    value_vars=['24/01/2018', '25/01/2018', '26/01/2018'],  # 需要转置的日期列
    var_name='Date',  # 转置后日期列的名称
    value_name='Value'  # 转置后对应数值的列名称
)

如果你的日期列很多,不想手动列出来,可以用自动筛选的方式获取所有非固定列:

# 自动获取所有日期列(排除Type和Class)
date_columns = df.columns.difference(['Type', 'Class'])
result_df = df.melt(
    id_vars=['Type', 'Class'],
    value_vars=date_columns,
    var_name='Date',
    value_name='Value'
)

最终输出结果

运行后得到的result_df就是你想要的格式:

Type      Class        Date  Value
0  Plant1      Plant  24/01/2018   5498
1  Plant2      Plant  24/01/2018   3416
2   Veg1  Vegetable  24/01/2018   5426
3   Veg2  Vegetable  24/01/2018   5317
4  Plant1      Plant  25/01/2018   5998
5  Plant2      Plant  25/01/2018   4844
6   Veg1  Vegetable  25/01/2018   5464
7   Veg2  Vegetable  25/01/2018   4616
8  Plant1      Plant  26/01/2018   5815
9  Plant2      Plant  26/01/2018   4991
10  Veg1  Vegetable  26/01/2018   3756
11  Veg2  Vegetable  26/01/2018   7528

和你给出的期望输出完全一致,只是包含了所有行(你示例里只列了部分)。

原理简单说

melt的核心逻辑就是把宽表中指定的多列(这里是日期列)“融化”成两列:一列存储原来的列名(也就是日期),另一列存储对应的值,同时保留你指定的固定列(Type、Class),完美匹配你从Excel转过来的操作逻辑~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:47:19