Pandas/Pyspark如何将多组变量值列melt为单变量单值列
问题根因
你之前的melt调用逻辑错误:你将metric_1/metric_2/metric_3全部设为固定保留的标识列(id_vars),但你的表结构是metric_n和value_n一一配对的独立指标-值组,三个metric列不属于行的固定公共属性,所以转换结果不符合预期。
Pandas 实现
优先用pd.wide_to_long,这个API是专门为这种列名带编号后缀的成对宽表设计的,代码最简洁:
df_long = pd.wide_to_long( df = df.reset_index(), stubnames = ["metric", "value"], i = "index", j = "pair_id" ).reset_index(drop=True)
转换后输出的长表结构如下,完全满足单指标列+单值列的要求:
metric value 0 a 1 1 b 3 2 c 5 3 x 2 4 y 4 5 z 6 6 j 7 7 k 8 8 l 9
如果要手动用melt实现,本质是分别对每对列做转换后合并:
df_list = [] for idx in range(1, 4): part = df[[f"metric_{idx}", f"value_{idx}"]].rename( columns={f"metric_{idx}": "metric", f"value_{idx}": "value"} ) df_list.append(part) df_long = pd.concat(df_list, ignore_index=True)
PySpark 实现
PySpark里用stack逆透视算子实现,性能最优:
from pyspark.sql.functions import expr df_long = df.select( expr( """ stack( 3, metric_1, value_1, metric_2, value_2, metric_3, value_3 ) as (metric, value) """ ) )
转换后字段结构和Pandas版本完全一致。
内容的提问来源于stack exchange,提问作者MS25
相关产品推荐
相关产品推荐

