根据 Pandas 中的列名称转置 df 列

Ros*_*ula 2 python dataframe pandas

我有一个 pandas 数据框,如下所示,我想根据列名称转置 df

我想转置所有具有_1、_2、_3 和_4 的列。我的 df 中有 100 多个值,下面是示例数据。


import pandas as pd

data = {
        # One Id Column
        'id':[1],
        
        #Other columns
        'c1':['1c'],
        'c2':['2c'],
        'c3':['3c'],
        
        #IC indicator
        'oc_1':[1],
        'oc_2':[0],
        'oc_3':[1],
        'oc_4':[1],
        
        #GC Indicator
        'gc_1':['T1'],
        'gc_2':['T2'],
        'gc_3':['T3'],
        'gc_4':['T4'],
        
        #PF Indicator
        'pf_1':['PF1'],
        'pf_2':['PF2'],
        'pf_3':['PF3'],
        'pf_4':['PF4'],
        
        #Values
        'V1_1':[11],
        'V1_2':[12],
        'V1_3':[13],
        'V1_4':[14],
        
        'S1_1':[21],
        'S1_2':[22],
        'S1_3':[23],
        'S1_4':[24]
        
        }
    
df = pd.DataFrame(data)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我需要将这个 df 转置为以下输出

在此输入图像描述

我尝试了下面的代码:

standard_cols = ['id','c1','c2','c3']
value_cols = ['V1_1','V1_2','V1_3','V1_4','S1_1','S1_2','S1_3','S1_4']
result_cols = standard_cols+['OC','GC','PF','Var','value']

melted_df = pd.melt(df, id_vars=standard_cols + ['oc_1','oc_2','oc_3','oc_4','gc_1','gc_2','gc_3','gc_4','pf_1','pf_2','pf_3','pf_4'],
                    value_vars=value_cols,var_name='Var',value_name='value')

print(melted_df)

Run Code Online (Sandbox Code Playgroud)

moz*_*way 5

您可以先使用 重塑形状wide_to_long,然后melt

standard_cols = ['id','c1','c2','c3']
value_cols = ['V1','S1']
result_cols = ['OC','GC','PF']

result_cols = [c.lower() for c in result_cols]

out = (pd
  .wide_to_long(
      df, i=standard_cols,
      stubnames=result_cols+value_cols,
      j='j', sep='_')
  .reset_index()
  .melt(standard_cols+result_cols+['j'],
        var_name='VAR', value_name='Value')
  .assign(VAR=lambda d: d['VAR']+'_'+d.pop('j').astype('str'))
)

print(out)
Run Code Online (Sandbox Code Playgroud)

输出:

   id  c1  c2  c3  oc  gc   pf   VAR  Value
0   1  1c  2c  3c   1  T1  PF1  V1_1     11
1   1  1c  2c  3c   0  T2  PF2  V1_2     12
2   1  1c  2c  3c   1  T3  PF3  V1_3     13
3   1  1c  2c  3c   1  T4  PF4  V1_4     14
4   1  1c  2c  3c   1  T1  PF1  S1_1     21
5   1  1c  2c  3c   0  T2  PF2  S1_2     22
6   1  1c  2c  3c   1  T3  PF3  S1_3     23
7   1  1c  2c  3c   1  T4  PF4  S1_4     24
Run Code Online (Sandbox Code Playgroud)