#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