Argsort DataFrame по столбцам

#python #pandas #dataframe

#python #панды #фрейм данных

Вопрос:

У меня есть следующий фрейм данных:

Идентификатор пользователя column_1 column_2 column_3
A 4.959 3.231 1.2356
B 0.632 0.963 2.4556
C 3.234 7.445 5.3435
D 1.454 0.343 2.2343

Я хотел бы выполнить сортировку по столбцам из предыдущего:

Идентификатор пользователя Первый второй третий
A column_3 column_2 column_1
B column_1 column_2 column_3
C column_1 column_3 column_2
D column_2 column_1 column_3

Комментарии:

1. кажется, что он сортирует строки, и вместо чисел он печатает имя столбца

2. В принципе, я хотел бы упорядочить значения для каждого пользователя. Для пользователя A столбец с наименьшим значением равен ‘column_3, второй столбец равен ‘column_2’, а столбец с наибольшим значением равен ‘column_1’.

3. @Craig но как вы вставляете в него имя столбца?

4. с удовольствием, спасибо за потрясающий ответ! я тоже умный…

Ответ №1:

Вы можете использовать np.argsort по оси 1. Затем преобразуйте df.columns в массив numpy с помощью pd.Index.to_numpy и используйте индексацию numpy.

 df = df.set_index('userId') # If userId is not index already.
idx = df.values.argsort(axis=1)
out = pd.DataFrame(df.columns.to_numpy()[idx], index=df.index)

               0         1         2
userId
A       column_3  column_2  column_1
B       column_1  column_2  column_3
C       column_1  column_3  column_2
D       column_2  column_1  column_3
 

Комментарии:

1. df.columns.to_numpy()[np.argsort(df)] после установки индекса также должно работать 🙂

Ответ №2:

другим методом было бы использовать stack() с sort_values() и map устанавливать пользовательские заголовки столбцов.

 mapper_ = {1 : 'first', 2 : 'second', 3 : 'third', 4 : 'fourth'}
s = (df.set_index('userId').stack().sort_values().groupby(level=0).cumcount()   1).map(mapper_)

s.reset_index(1).set_index(0,append=True).unstack(0)




        level_1                    
0          first    second     third
userId                              
A       column_3  column_2  column_1
B       column_1  column_2  column_3
C       column_1  column_3  column_2
D       column_2  column_1  column_3