Python — сортировка значений каждой строки в таблице и получение нового фрейма данных Pandas с исходным индексом / метками столбцов в отсортированной последовательности в каждой строке

#python #pandas #sorting

Вопрос:

У меня просто есть таблица в формате csv, например

Дата Компания1 Компания2 Компания3
01.01.2020 1,01 0,9 1
02.01.2020 0,9 2,2 2
24.10.2020 1,02 1,01 1,03

Теперь моя цель — отсортировать каждую строку в порядке убывания. Итак, я, наконец, получаю следующую таблицу:

Дата 1 2 3
01.01.2020 Компания1 Компания3 Компания2
02.01.2020 Компания2 Компания3 Компания1
24.10.2020 Компания3 Компания1 Компания2

это простой способ что-то сделать с python?

Ответ №1:

Вы можете использовать .apply() в каждой строке для сортировки значений в порядке убывания и получения индекса (т. Е. Меток столбцов) отсортированной последовательности:

 df2 = (df.set_index('Date')[['Company1', 'Company2', 'Company3']]
         .replace(r',', r'.', regex=True)
         .astype(float)
         .apply(lambda x: x.sort_values(ascending=False).index.tolist(), axis=1, result_type='expand')
         .pipe(lambda x: x.set_axis(x.columns 1, axis=1))
         .reset_index()
      )
 

Результат:

 print(df2)


         Date         1         2         3
0  01.01.2020  Company1  Company3  Company2
1  02.01.2020  Company2  Company3  Company1
2  24.10.2020  Company3  Company1  Company2
 

Ответ №2:

Вы можете использовать изменение формы с помощью melt sort_values и создать вспомогательный столбец, а затем вернуть исходную форму с помощью вспомогательного столбца в качестве имен столбцов:

 (df.melt(id_vars='Date')
   .sort_values(by='value', ascending=False)
   .assign(col=lambda d: d.groupby('Date').cumcount().add(1))
   .pivot(index='Date', columns='col', values='variable')
)
 

вывод:

 col                1         2         3
Date                                    
01.01.2020  Company1  Company3  Company2
02.01.2020  Company2  Company3  Company1
24.10.2020  Company3  Company1  Company2
 

Ответ №3:

Один подход, использующий np.argsort

 # get column names
columns = df.columns[1:].to_numpy()

# get sorted indices
indices = np.argsort(df.iloc[:, 1:] * -1, axis=1)

# create new DataFrame
res = pd.concat([df["Date"], pd.DataFrame(columns[indices], columns=range(1, 4))], axis=1)
print(res)
 

Вывод

          Date         1         2         3
0  01.01.2020  Company1  Company3  Company2
1  02.01.2020  Company2  Company3  Company1
2  24.10.2020  Company3  Company1  Company2