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)
您可以先使用 重塑形状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)
归档时间: |
|
查看次数: |
194 次 |
最近记录: |