Python-按顺序操作列和行-重塑

时间:2018-10-03 09:47:49

标签: python pandas transformation data-manipulation melt

我有一个输入数据框:

import pandas as pd

df = pd.DataFrame({"AX_970" : {0 : 0.7, 1 : 0.1, 2 : 0.2},
                   "AZ_980" : {0 : 0.2, 1 : 0.7, 2 : 0.1},
                   "BV_197" : {0 : 0.5, 1 : 0.2, 2 : 0.3},
                   "BT_980" : {0 : 0.1, 1 : 0.22, 2 : 0.7}
                   })
df["id"] = df.index
df.head()

Input table

    AX_970  AZ_980  BT_980  BV_197  id
0     0.7      0.2     0.1   0.5    0
1     0.1      0.7    0.22   0.2    1
2     0.2      0.1     0.7   0.3    2

我需要转换此输入,如下面的输出示例所示:

(输出降序排列)

        1      2       3       4   id
0   AX_970  BV_197  AZ_980  BT_980  0
1   AZ_980  BT_980  BV_197  AX_970  1
2   BT_980  BV_197  AX_970  AZ_980  2

如果您有任何想法,请分享。 非常感谢你!

1 个答案:

答案 0 :(得分:1)

您可以将np.argsortpd.DataFrame.iloc结合使用:

df.iloc[:, :-1] = df.columns[np.argsort(df.iloc[:, :-1].values, axis=1)[:, ::-1]]
df.columns[    

print(df)

   AX_970  AZ_980  BT_980  BV_197  id
0  AX_970  BV_197  AZ_980  BT_980   0
1  AZ_980  BT_980  BV_197  AX_970   1
2  BT_980  BV_197  AX_970  AZ_980   2

您可以按以下方式重命名列。逻辑上很冗长,因为您不应该就地更新基础数组,因为这可能会引起副作用。

arr = df.columns.values
arr[:-1] = np.arange(1, len(df.columns))
df.columns = arr

print(df)

        1       2       3       4  id
0  AX_970  BV_197  AZ_980  BT_980   0
1  AZ_980  BT_980  BV_197  AX_970   1
2  BT_980  BV_197  AX_970  AZ_980   2