Python - манипулирование столбцами и строками с упорядочением - изменение формы - PullRequest
0 голосов
/ 03 октября 2018

У меня есть входной фрейм данных:

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

Если у вас есть идеи, пожалуйста, поделитесь.Большое спасибо!

1 Ответ

0 голосов
/ 03 октября 2018

Вы можете использовать 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
...