Сортировать фрейм данных, используя словарь в качестве критерия сортировки - PullRequest
0 голосов
/ 06 мая 2019

Есть похожий вопрос здесь , но не совсем то, что я ищу.

Я хочу отсортировать фрейм данных на основе словаря, в котором указаны столбцы для сортировкиа также порядок для каждого столбца.

Пример:

df =
+-------+-------+-----------+------+
| Index | Time  |   Month   | Year |
+-------+-------+-----------+------+
|     0 | 13:00 | January   | 2018 |
|     1 | 14:30 | March     | 2015 |
|     2 | 12:00 | November  | 2003 |
|     3 | 10:15 | September | 2012 |
|     4 | 13:30 | October   | 2012 |
|     5 | 06:25 | June      | 2012 |
|     6 | 07:50 | August    | 2019 |
|     7 | 09:20 | May       | 2015 |
|     8 | 22:30 | July      | 2016 |
|     9 | 23:05 | April     | 2013 |
|    10 | 21:10 | April     | 2008 |
+-------+-------+-----------+------+

sort_dict = {'Month': 'Ascending', 'Year': 'Descending', 'Time': 'Ascending'}

df.sort_values(by=sort_dict)

df = 
+-------+-------+-----------+------+
| Index | Time  |   Month   | Year |
+-------+-------+-----------+------+
|     0 | 13:00 | January   | 2018 |
|     1 | 14:30 | March     | 2015 |
|     9 | 23:05 | April     | 2013 |
|    10 | 21:10 | April     | 2008 |
|     7 | 09:20 | May       | 2015 |
|     5 | 06:25 | June      | 2012 |
|     8 | 22:30 | July      | 2016 |
|     6 | 07:50 | August    | 2019 |
|     3 | 10:15 | September | 2012 |
|     4 | 13:30 | October   | 2012 |
|     2 | 12:00 | November  | 2003 |
+-------+-------+-----------+------+

Спасибо за любую помощь, спасибо!

Индекс столбца также будет хорошо:

sort_dict = {2: 'Ascending', 3: 'Descending', 1: 'Ascending'}

1 Ответ

2 голосов
/ 06 мая 2019

РЕДАКТИРОВАТЬ: (спасибо @Jon Clements)

В Python 3.6 объявление sort_dict порядок ключей будет таким, как указано, однако, до 3.6, литералы dict не обязательно сохраняют порядок.например.в 3.5 объявление sort_dict заканчивается {'Month': 'Ascending', 'Time': 'Ascending', 'Year': 'Descending'} ... что будет другим порядком итерации - таким образом, будут разные результаты сортировки.

Если всегда нужен один и тот же порядок, используйте конструктор OrderedDict или Series - там порядок не зависит от версии python.

Одним из возможных решений является создание помощника Series, тогдапреобразовать индекс в список и передать также параметр ascending заполненный логический список:

s = pd.Series(sort_dict)
print (s)
Month     Ascending
Year     Descending
Time      Ascending
dtype: object

df = df.sort_values(by=s.index.tolist(), ascending = (s == 'Ascending'))
print (df)
        Time      Month  Year
Index                        
9      23:05      April  2013
10     21:10      April  2008
6      07:50     August  2019
0      13:00    January  2018
8      22:30       July  2016
5      06:25       June  2012
1      14:30      March  2015
7      09:20        May  2015
2      12:00   November  2003
4      13:30    October  2012
3      10:15  September  2012
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...