Как правильно использовать pandas sort_index с аргументами уровня и оси? - PullRequest
1 голос
/ 23 января 2020

Относительно этого df:

               Amount                          type                 
Month_year 2019-06-01     2019-07-01     2019-06-01    2019-07-01   
TYPE_ID             1   2          1   2          1  2          1  2
ID                                                                  
100                20  10         40  20          1  1          2  1
200                80  60         30  10          2  2          1  1

Следующий код:

df = df.sort_index(axis=1, level=[1,2])

производит это:

               Amount       type     Amount  ...       type     Amount       type
Month_year 2019-06-01 2019-06-01 2019-06-01  ... 2019-07-01 2019-07-01 2019-07-01
TYPE_ID             1          1          2  ...          1          2          2
ID                                           ...                                 
100                20          1         10  ...          2         20          1
200                80          2         60  ...          1         10          1

Я действительно не понимаю, что происходит , Я прочитал документы , но примеров нет, и описание действительно неясное.

Может кто-нибудь объяснить мне, как работает этот метод и как я получил этот результат?

1 Ответ

5 голосов
/ 27 января 2020

По существу,

sort_index с axis=1 сортирует заголовки столбцов, и этот порядок затем используется для установки порядка столбцов.

И , следствие,

sort_index с axis=0 сортирует индекс, и этот порядок затем используется для установки порядка строк.


Вот как выглядит ваш ввод df:

enter image description here

Три верхние «строки» на рисунке выше соответствуют столбцу pandas MultiIndex из df, который выглядит следующим образом:

df.columns
MultiIndex([('Amount', '2019-06-01', 1),
            ('Amount', '2019-06-01', 2),
            ('Amount', '2019-07-01', 1),
            ('Amount', '2019-07-01', 2),
            (  'type', '2019-06-01', 1),
            (  'type', '2019-06-01', 2),
            (  'type', '2019-07-01', 1),
            (  'type', '2019-07-01', 2)])

Давайте представим, что ваш трехуровневый столбец multiIndex волшебным образом преобразуется в DataFrame, каждый уровень которого имеет свой собственный столбец с именем cdf:

cdf
    level_0     level_1  level_2
(1)  Amount  2019-06-01        1
(2)  Amount  2019-06-01        2
(3)  Amount  2019-07-01        1
(4)  Amount  2019-07-01        2
(5)    type  2019-06-01        1
(6)    type  2019-06-01        2
(7)    type  2019-07-01        1
(8)    type  2019-07-01        2

Номера строк здесь соответствуют идентификаторам столбцов в исходном кадре данных. Давайте посмотрим, что происходит, когда мы сортируем cdf по последним двум столбцам:

cdf.sort_values(['level_1', 'level_2'])

    level_0     level_1  level_2
(1)  Amount  2019-06-01        1
(5)    type  2019-06-01        1
(2)  Amount  2019-06-01        2
(6)    type  2019-06-01        2
(3)  Amount  2019-07-01        1
(7)    type  2019-07-01        1
(4)  Amount  2019-07-01        2
(8)    type  2019-07-01        2

Обратите внимание на индекс отсортированного cdf:

(1) (5) (2) (6) (3) (7) (4) (8)

Теперь давайте посмотрим, что произойдет, когда мы применяем операцию sort_index к df:

df.sort_index(level=[1, 2], axis=1)

enter image description here

Эллипсы в центре указывают, что не все столбцы могут отображаться из-за на ширину терминала (на самом деле столбцы (6) и (3) не отображаются, но их там очень много), но это не самая интересная часть. Сравните здесь порядок столбцов с порядком строк cdf, вы увидите, что они идентичны.

...