Сортировать столбцы по уникальным значениям - PullRequest
3 голосов
/ 14 июля 2020

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

  AAA  X_980  X_100  X_990  X_1100  X_2200  X_Y_100  X_Y_2200  X_Y_990  X_Y_1100  X_Y_980  X_10_100  X_10_980  X_10_990  X_10_1100  X_10_2200  X_A  X_A_B
  100      6      6      6       3       4        1         7        5         1        9         9         2         7          3          7    3      8
  980      2      9      5       5       9        3         6        2         1        3         1         8         2          9          4    8      4
  990      8      8      7       7       9        3         5        7         3        1         5         5         6          6          1    3      4
 1100      6      5      4       7       4        6         2        1         6        2         3         5         3          9          7    5      2
 2200      7      4      3       2       4        5         9        1         9        4         6         5         8          7          7    7      9

Как видите, в столбце AAA есть 5 уникальных значений и 3 группы столбцов: X_, X_Y_ и X_10_, за которым следует суффикс с каждым из уникальных значений. Я хочу изменить порядок столбцов, чтобы каждая группа столбцов сортировалась по уникальным значениям (по возрастанию).

Ожидаемый результат:

  AAA  X_100  X_980  X_990  X_1100  X_2200  X_Y_100  X_Y_980  X_Y_990  X_Y_1100  X_Y_2200  X_10_100  X_10_980  X_10_990  X_10_1100  X_10_2200  X_A  X_A_B
  100      6      6      6       3       4        1        9        5         1         7         9         2         7          3          7    3      8
  980      9      2      5       5       9        3        3        2         1         6         1         8         2          9          4    8      4
  990      8      8      7       7       9        3        1        7         3         5         5         5         6          6          1    3      4
 1100      5      6      4       7       4        6        2        1         6         2         3         5         3          9          7    5      2
 2200      4      7      3       2       4        5        4        1         9         9         6         5         8          7          7    7      9

1 Ответ

4 голосов
/ 14 июля 2020

Подход № 1

С простыми манипуляциями со столбцами -

c = df.columns.values.copy()
c1 = df1.columns
c[np.isin(c,c1)] = c1
df_out = df.loc[:,c]

Пример вывода -

In [174]: df_out
Out[174]: 
    AAA  X_100  X_980  X_990  X_1100  X_2200  X_Y_100  X_Y_980  X_Y_990  X_Y_1100  X_Y_2200  X_10_100  X_10_980  X_10_990  X_10_1100  X_10_2200  X_A  X_A_B
0   100      6      6      6       3       4        1        9        5         1         7         9         2         7          3          7    3      8
1   980      9      2      5       5       9        3        3        2         1         6         1         8         2          9          4    8      4
2   990      8      8      7       7       9        3        1        7         3         5         5         5         6          6          1    3      4
3  1100      5      6      4       7       4        6        2        1         6         2         3         5         3          9          7    5      2
4  2200      4      7      3       2       4        5        4        1         9         9         6         5         8          7          7    7      9

Подход № 2 : выталкивает новые данные вперед

In [117]: df1 = df[[i+str(j) for i in ['X_', 'X_Y_', 'X_10_'] for j in df.AAA]]

In [118]: c,c1 = df.columns,df1.columns

In [119]: pd.concat(( df1, df[c[~np.isin(c,c1)]]),axis=1)
Out[119]: 
   X_100  X_980  X_990  X_1100  X_2200  X_Y_100  X_Y_980  X_Y_990  X_Y_1100  X_Y_2200  X_10_100  X_10_980  X_10_990  X_10_1100  X_10_2200   AAA  X_A  X_A_B
0      6      6      6       3       4        1        9        5         1         7         9         2         7          3          7   100    3      8
1      9      2      5       5       9        3        3        2         1         6         1         8         2          9          4   980    8      4
2      8      8      7       7       9        3        1        7         3         5         5         5         6          6          1   990    3      4
3      5      6      4       7       4        6        2        1         6         2         3         5         3          9          7  1100    5      2
4      4      7      3       2       4        5        4        1         9         9         6         5         8          7          7  2200    7      9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...