我有一个如下所示的数据框: 我想取消此数据帧,以使相同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值)
答案 0 :(得分:2)
使用DataFrame.unstack
进行整形,但首先通过Index.difference
获取所有没有IV
和IC
的列,并通过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