首页 > 解决方案 > 转置熊猫数据框中的多列

问题描述

       AD    AP    AR     MD        MS     iS    AS
0    169.88  0.00  50.50  814.0    57.3    32.3  43.230
1     12.54  0.01  84.75   93.0    51.3    36.6  43.850
2    321.38  0.00  65.08  986.0    56.7    28.9  42.070

我想将上面的数据框更改为转置版本,其中对于每一列,值都放在一行中,例如对于列ADAP,它看起来像这样

d1_AD   d2_AD  d3_AD     d1_AP     d2_AP    d3_AP
169.88  12.54  321.38    0.00      0.01     0.00

我可以进行转置,但是如何获得上面的列名和输出结构?

注意:为便于阅读,输出被截断,但实际输出应包括所有其他列,如AR MD MS iS AS

标签: pythonpandas

解决方案


我们可以rename制作正确形式的索引,然后stackand sort_index,然后 Collapse MultiIndex and to_frameandtranspose

new_df = df.rename(lambda x: f'd{x + 1}').stack().sort_index(level=1)
new_df.index = new_df.index.map('_'.join)
new_df = new_df.to_frame().transpose()

输入df

df = pd.DataFrame({
    'AD': [169.88, 12.54, 321.38], 'AP': [0.0, 0.01, 0.0],
    'AR': [50.5, 84.75, 65.08], 'MD': [814.0, 93.0, 986.0],
    'MS': [57.3, 51.3, 56.7], 'iS': [32.3, 36.6, 28.9],
    'AS': [43.23, 43.85, 42.07]
})

new_df

    d1_AD  d2_AD   d3_AD  d1_AP  d2_AP  ...  d2_MS  d3_MS  d1_iS  d2_iS  d3_iS
0  169.88  12.54  321.38    0.0   0.01  ...   51.3   56.7   32.3   36.6   28.9

[1 rows x 21 columns]

如果字典排序不起作用,我们可以等待将 MultiIndex 转换为字符串,直到之后sort_index

new_df = df.stack().sort_index(level=1)  # Sort level 1 (by number)
new_df.index = new_df.index.map(lambda x: f'd{x[0]+1}_{x[1]}')
new_df = new_df.to_frame().transpose()

更大的框架:

df = pd.concat([df] * 4, ignore_index=True)

截断输出:

    d1_AD  d2_AD   d3_AD   d4_AD  d5_AD  ...  d8_iS  d9_iS  d10_iS  d11_iS  d12_iS
0  169.88  12.54  321.38  169.88  12.54  ...   36.6   28.9    32.3    36.6    28.9

[1 rows x 84 columns]

如果需要与 相同顺序的列df,请使用meltusingignore_index=False不必重新计算组并让melt处理排序:

new_df = df.melt(value_name=0, ignore_index=False)
new_df = new_df[[0]].set_axis(
    # Create the new index
    'd' + (new_df.index + 1).astype(str) + '_' + new_df['variable']
).transpose()

较大帧上的截断输出:

    d1_AD  d2_AD   d3_AD   d4_AD  d5_AD  ...  d8_AS  d9_AS  d10_AS  d11_AS  d12_AS
0  169.88  12.54  321.38  169.88  12.54  ...  43.85  42.07   43.23   43.85   42.07

[1 rows x 84 columns]

推荐阅读