gpt4 book ai didi

python - Unpivot/unmelt 以创建动态列

转载 作者:行者123 更新时间:2023-12-01 00:50:59 27 4
gpt4 key购买 nike

我有一个如下所示的数据框:我想解开这个数据框,以便相同 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 值)

最佳答案

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

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

关于python - Unpivot/unmelt 以创建动态列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56577064/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com