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

如何将含多列不同名称case的宽格式DataFrame转为长格式?

解决方案:使用melt方法实现宽转长

对于你的需求,pandas.melt()是最直接的解决方案,能轻松将指定宽格式列转为长格式,同时保留其他关联列的对应值。

步骤说明

  1. 确定保留列:id和vpd是需要与每个case行关联的列,作为id_vars参数传入。
  2. 确定转换列:所有以case开头的列(case1、case2、case3)是需要转为行的列,作为value_vars参数传入。
  3. 指定新列名:var_name设置为存储原列名的列(后续用作索引),value_name设置为存储原列值的列(即case)。
  4. 最后将原列名列设置为索引,匹配期望格式。

完整代码示例

import pandas as pd

# 创建测试DataFrame
df = pd.DataFrame({
    'id': [1,2], 
    'case1': [3,1], 
    'case2': [3,2], 
    'case3': [3,2], 
    'vpd': [2,1]
})

# 使用melt实现宽转长
long_df = df.melt(
    id_vars=['id', 'vpd'],  # 保留的关联列
    value_vars=['case1', 'case2', 'case3'],  # 需要转成行的列
    var_name='index',  # 原列名存储的列名
    value_name='case'  # 原列值存储的列名
).set_index('index')  # 设置索引

print(long_df)

输出结果

id  vpd  case
index                
case1    1    2     3
case2    1    2     3
case3    1    2     3
case1    2    1     1
case2    2    1     2
case3    2    1     2

该结果完全匹配你期望的输出格式。

补充:用wide_to_long实现的正确方式

如果一定要用wide_to_long,可以通过调整参数实现,需要指定stubnames和suffix:

long_df_wide = pd.wide_to_long(
    df, 
    stubnames='case',  # 列名的共同前缀
    i=['id', 'vpd'],  # 索引列
    j='index',  # 后缀存储的列名
    suffix='\\d+'  # 匹配数字后缀的正则
).reset_index().set_index('index')

print(long_df_wide)

输出结果和melt方法一致,你之前可能是参数设置不当导致结果不符合预期。

内容的提问来源于stack exchange,提问作者hulio_entredas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 14:45:06