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

Pandas中宽表转长表的替代实现方法咨询

Pandas中宽表转长表的替代实现方法咨询

嗨,看起来你已经用上了pd.melt这个宽转长的常用工具,但目前的结果里少了Name列对吧?这是因为你没把Name加入到id_vars参数里,先帮你把这个小问题修正,再给你介绍几种其他的宽转长实现方式~

首先先调整你现有的pd.melt代码,把Name也放到id_vars中,这样就能得到你想要的包含Name、Date、Variable、Value的目标长表了:

pd.melt(df,
        id_vars=["Name", "Date"],  # 把Name也加入标识变量列表
        value_vars=["A", "B", "C", "D"],
        var_name="Variable",
        value_name="Value")

接下来给你分享几种其他的实现思路:

方法1:使用DataFrame.stack()

stack()可以把列标签转换为索引的内层层级,非常适合这类多特征列转长表的场景,步骤如下:

  1. 先将Name和Date设置为数据的索引,保留需要转换的A/B/C/D列
  2. 调用stack()把列名转成内层索引
  3. 重置索引并给新列命名

代码示例:

(df.set_index(["Name", "Date"])
   .stack()
   .reset_index(name="Value")
   .rename(columns={"level_2": "Variable"}))

方法2:使用pd.wide_to_long()

这个方法更适合列名有统一命名规则的场景,不过你的数据也可以适配使用。需要指定标识列、目标变量列名等参数:

pd.wide_to_long(df, 
                stubnames=["A", "B", "C", "D"],
                i=["Name", "Date"],  # 作为标识的列
                j="Variable",  # 转换后变量列的名称
                sep="")  # 列名没有分隔符,设为空字符串

如果你的列名是类似feat_A这种带统一前缀的格式,wide_to_long会更灵活顺手。

方法3:简化版melt(自动识别待转换列)

如果你的数据表中,除了Name和Date之外,剩下的列都是需要转成Variable的,那可以不用手动指定value_vars,让melt自动识别:

pd.melt(df,
        id_vars=["Name", "Date"],
        var_name="Variable",
        value_name="Value")

以上几种方法都能实现你要的宽表转长表效果,你可以根据自己的使用习惯和数据的实际情况来选择~

备注:内容来源于stack exchange,提问作者Cookfishbro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 07:13:13