如何将含多列不同名称case的宽格式DataFrame转为长格式?
解决方案:使用
melt方法实现宽转长 对于你的需求,pandas.melt()是最直接的解决方案,能轻松将指定宽格式列转为长格式,同时保留其他关联列的对应值。
步骤说明
- 确定保留列:
id和vpd是需要与每个case行关联的列,作为id_vars参数传入。 - 确定转换列:所有以
case开头的列(case1、case2、case3)是需要转为行的列,作为value_vars参数传入。 - 指定新列名:
var_name设置为存储原列名的列(后续用作索引),value_name设置为存储原列值的列(即case)。 - 最后将原列名列设置为索引,匹配期望格式。
完整代码示例
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
相关产品推荐
相关产品推荐

