Pandas.sort_index не сортирует по второму заданному аргументу - PullRequest
1 голос
/ 18 марта 2019

Вот MWE:

import pandas as pd

pd.np.random.seed(0)
(
    pd.DataFrame(pd.np.random.rand(10, 5), columns=['a', 'b', 'c', 'd', 'e'])
    .assign(b=lambda df: (df.b*10).astype(int))
    .set_index(['a', 'b', 'c'])
    .sort_index(axis=0, level=['b', 'a'])
)

Out[96]: 
                            d         e
a        b c                           
0.087129 0 0.832620  0.778157  0.870012
0.639921 1 0.944669  0.521848  0.414662
0.670638 2 0.128926  0.315428  0.363711
0.359508 4 0.697631  0.060225  0.666767
0.645894 4 0.891773  0.963663  0.383442
0.791725 5 0.568045  0.925597  0.071036
0.617635 6 0.616934  0.943748  0.681820
0.264556 7 0.456150  0.568434  0.018790
0.978618 7 0.461479  0.780529  0.118274
0.548814 7 0.602763  0.544883  0.423655

Я не понимаю, почему индекс a не сортируется (см. Строки b=7).

Ожидаемые результаты (ноне приемлемое решение):

pd.np.random.seed(0)
(
    pd.DataFrame(pd.np.random.rand(10, 5), columns=['a', 'b', 'c', 'd', 'e'])
    .assign(b=lambda df: (df.b*10).astype(int))
    .sort_values(['b', 'a'])
    .set_index(['a', 'b', 'c'])
)

Out[104]: 
                            d         e
a        b c                           
0.087129 0 0.832620  0.778157  0.870012
0.639921 1 0.944669  0.521848  0.414662
0.670638 2 0.128926  0.315428  0.363711
0.359508 4 0.697631  0.060225  0.666767
0.645894 4 0.891773  0.963663  0.383442
0.791725 5 0.568045  0.925597  0.071036
0.617635 6 0.616934  0.943748  0.681820
0.264556 7 0.456150  0.568434  0.018790
0.548814 7 0.602763  0.544883  0.423655
0.978618 7 0.461479  0.780529  0.118274

1 Ответ

0 голосов
/ 18 марта 2019

При настройке мультииндекса вы должны указать b в качестве первого уровня вашего индекса:

...
.set_index(['b', 'a', 'c'])
...

Вывод:

                            d           e
b   a           c       
0   0.087129    0.832620    0.778157    0.870012
1   0.639921    0.944669    0.521848    0.414662
2   0.670638    0.128926    0.315428    0.363711
4   0.359508    0.697631    0.060225    0.666767
    0.645894    0.891773    0.963663    0.383442
5   0.791725    0.568045    0.925597    0.071036
6   0.617635    0.616934    0.943748    0.681820
7   0.264556    0.456150    0.568434    0.018790
    0.548814    0.602763    0.544883    0.423655
    0.978618    0.461479    0.780529    0.118274

Мультииндекс в пандах работаеткак вложенная структура индексов: строки группируются сначала по индексу 1-го уровня, затем 2-го уровня и т. д.

Итак, когда вы задаете a в качестве первого уровня, он пытается найти другие строки, которыеимеют одинаковое значение (например, 0.264556) на том же уровне индекса.Поскольку ваши a -значения в целом кажутся уникальными, каждая группа в конечном итоге имеет только одного члена, что означает, что в каждой группе нечего сортировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...