#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