首页 > 解决方案 > Python - 使用排序操作列和行 - 重塑

问题描述

我有一个输入数据框:

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()

输入表

    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

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

标签: pythonpandastransformationdata-manipulationmelt

解决方案


您可以np.argsort使用pd.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

推荐阅读