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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:03:17