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

如何将含站点列的宽格式Pandas DataFrame转换为长格式?

Pandas 宽格式DataFrame转长格式(站点需求数据重塑)

你的需求是典型的宽格式转长格式操作,其实melt就是最适合的工具,可能是之前用法有误。以下是两种Pandas内置的实现方式:

方法1:使用melt函数

先构造你的原始DataFrame:

import pandas as pd

# 原始宽格式数据
df = pd.DataFrame({
    'station 1': [0.1, -0.04],
    'station 2': [1.2, 0.9]
})

通过melt直接转换,指定行索引作为标识变量,同时设置新列的名称:

# 转换为长格式
df_long = df.reset_index().melt(
    id_vars='index',       # 保留原行索引作为标识
    var_name='station',    # 原列名转为新列"station"
    value_name='demand'    # 原数值转为新列"demand"
).reset_index(drop=True)   # 重置结果的索引

执行后得到的df_long结构如下(与你的目标表一致):

index     station  demand
0      0  station 1    0.10
1      1  station 1   -0.04
2      0  station 2    1.20
3      1  station 2    0.90

如果需要严格按站点分组排序,可追加sort_values:

df_long = df.reset_index().melt(
    id_vars='index',
    var_name='station',
    value_name='demand'
).sort_values('station').reset_index(drop=True)

方法2:使用stack函数

stack通过将列标签转为行索引层级来实现重塑,再展开为普通列:

# 转换为长格式
df_long = df.stack().reset_index()
# 重命名列名匹配需求
df_long.columns = ['index', 'station', 'demand']
# 重置结果索引
df_long = df_long.reset_index(drop=True)

该方法同样能得到符合要求的结果。

注:你给出的目标表中第二行需求值为-0.4,应为原数据-0.04的笔误,上述代码会保留原始数据的准确值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:42:15