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

Pandas预测任务:从列名提取horizon并堆叠y、yhat值的实现需求

解决方案

你可以直接使用pandas内置的pd.wide_to_long()方法实现需求,这个方法专门适配你的变量名_horizon格式的列名,代码简洁高效:

import pandas as pd

# 宽表转长表核心逻辑
result = pd.wide_to_long(
    df=dat,
    stubnames=["y", "yhat"],
    i=["initialisation_time", "pixel"],
    j="horizon",
    sep="_",
    suffix=r"\d+"
).reset_index()

# 可选:如果需要列名匹配你示例的y_hat,可以重命名
result = result.rename(columns={"yhat": "y_hat"})

方法说明

  • stubnames参数指定要提取的变量前缀,这里就是你要保留的y和yhat
  • i参数指定不需要转换、要保留的标识列
  • j参数指定从列名后缀提取的数值要存到的列名,也就是你要的horizon
  • sep指定前缀和后缀的分隔符,这里是下划线
  • suffix指定后缀的匹配规则,这里用正则匹配数字,会自动把提取到的后缀转为int类型,符合你对horizon值的要求

如果你习惯用melt + pivot的组合实现,也可以用下面的写法,效果完全一致:

# 第一步:把所有数值列转为行
melted_df = dat.melt(
    id_vars=["initialisation_time", "pixel"],
    value_vars=["y_0", "y_1", "yhat_0", "yhat_1"],
    var_name="col_name",
    value_name="val"
)

# 第二步:拆分列名得到变量类型和horizon
melted_df[["var_type", "horizon"]] = melted_df["col_name"].str.split("_", expand=True)
melted_df["horizon"] = melted_df["horizon"].astype(int)

# 第三步:把y和yhat转回为列
result = melted_df.pivot(
    index=["initialisation_time", "pixel", "horizon"],
    columns="var_type",
    values="val"
).reset_index().rename_axis(columns=None).rename(columns={"yhat": "y_hat"})

两种方法输出的结果都和你给出的目标样例结构完全一致,最终行数为1464行,horizon值全部从原列名提取,数值对应正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:24:03