取消透视/取消融合以创建动态列

时间:2019-06-13 09:06:31

标签: python pandas

我有一个如下所示的数据框: 我想取消此数据帧,以使相同I_S值的不同IV值进入不同的列,而对IC列也相同。

df_1.columns
Index(['I_Y', 'I_DY', 'I_H', 'I_M', 'I_S', 'IB', 'ISZ'], dtype='object', name='BSF')

'I_Y', 'I_DY', 'I_H', 'I_M', 'I_S', 'IV',  'IC'
 2015   55      21      57     8     5.67  200
 2015   55      21      57     8     5.66  100
 2015   55      21      57     9     5.65  200
 2015   55      21      57     9     5.64  200
 2015   55      21      57     10    5.67  200
 2015   55      21      57     10    5.66  200
 2015   55      21      57     10    5.65  600
 2015   55      21      57     10    5.64  200

所需的输出:

'I_Y', 'I_DY', 'I_H', 'I_M', 'I_S', 'IV1','IC1','IV2','IC2','IV3','IC3','IV4','IC4'
 2015   55      21      57     8    5.67   200   5.66  100
 2015   55      21      57     9    5.65   200   5.63  200
 2015   55      21      57     10   5.67   200   5.66  200  5.65  600  5.64  200 

由于我不知道IV可以运行多少个级别,因此我一直在考虑使其动态化,并为每个级别创建一个列。 (按级别,我指的是不同的IV值)

1 个答案:

答案 0 :(得分:2)

使用DataFrame.unstack进行整形,但首先通过Index.difference获取所有没有IVIC的列,并通过GroupBy.cumcount创建计数器,最后按第二级排序MultiIndex中的列,并在列表理解中将MultiIndex中的f-string展平:

df.columns = df.columns.str.strip("'")

cols = df.columns.difference(['IV','IC']).tolist()
g = df.groupby(cols).cumcount().add(1)
df1 = df.set_index(cols + [g]).unstack().sort_index(axis=1, level=1)
df1.columns = [f'{x}{y}' for x, y in df1.columns]
df1 = df1.reset_index()
print (df1)
   I_DY  I_H  I_M  I_S   I_Y    IC1   IV1    IC2   IV2    IC3   IV3    IC4  \
0    55   21   57    8  2015  200.0  5.67  100.0  5.66    NaN   NaN    NaN   
1    55   21   57    9  2015  200.0  5.65  200.0  5.64    NaN   NaN    NaN   
2    55   21   57   10  2015  200.0  5.67  200.0  5.66  600.0  5.65  200.0   

    IV4  
0   NaN  
1   NaN  
2  5.64