Pandas中能否仅使用melt()函数完成指定结构的宽表转长表操作?
结论
不能仅通过melt()函数实现这个需求。
原因说明
melt()的作用只有宽表转长表的列转行逻辑,本质是把指定的多列压缩为「列名、列值」的键值对结构,单次调用根本覆盖不了需求里的其他处理逻辑:
- 没法自动拆分
Weight Before这类列名里包含的「指标类型(Weight/Height)」「测试阶段(Before/After)」两个独立维度 - 压成长表后,同一个人同一个阶段的Weight、Height值会分成两行存储,没法直接变成同行的两个独立字段
- 没法直接生成要求的
John-1/Kelly-2这类带阶段编号后缀的Name值
可落地的实现代码
先加载原始测试数据:
import pandas as pd df = pd.DataFrame({'Name': ['John', 'Kelly'], 'Weight Before': [200, 175], 'Weight After': [195, 165], 'Height Before': [6, 5], 'Height After': [7, 6]})
实现思路是用melt做第一步列转行,再配合字符串拆分、透视完成剩余处理:
# 第一步:melt把所有指标列转为长表 df_long = df.melt(id_vars="Name", var_name="col_info", value_name="value") # 第二步:拆分列名里的指标和阶段信息 df_long[["metric", "stage"]] = df_long["col_info"].str.split(" ", expand=True) # 第三步:生成要求的带后缀Name字段,Before对应1,After对应2 df_long["Name"] = df_long["Name"] + "-" + df_long["stage"].replace({"Before": "1", "After": "2"}) # 第四步:透视把Weight、Height转回独立列,整理字段顺序 result = df_long.pivot(index="Name", columns="metric", values="value").reset_index()[["Name", "Weight", "Height"]]
最终输出结果完全匹配要求:
Name Weight Height 0 John-1 200 6 1 John-2 195 7 2 Kelly-1 175 5 3 Kelly-2 165 6
内容的提问来源于stack exchange,提问作者092374
相关产品推荐
相关产品推荐

