Pandas.sort_index不会按第二个给定参数排序

时间:2019-03-18 19:06:40

标签: python pandas sorting

这是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 :(得分:0)

设置多索引时,您需要提供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

pandas中的多索引是索引的嵌套结构:行首先按第一级索引分组,然后按第二级等分组。

因此,当您提供a作为第一级时,它会尝试查找同一索引级别中具有相同值(例如0.264556)的其他行。因为您的a值通常看起来是唯一的,所以每个组最终只有一个成员,这意味着每个组中没有什么可以排序的。