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和yhati参数指定不需要转换、要保留的标识列j参数指定从列名后缀提取的数值要存到的列名,也就是你要的horizonsep指定前缀和后缀的分隔符,这里是下划线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
相关产品推荐
相关产品推荐

