这是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

最佳答案

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


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

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

关于python - Pandas.sort_index不按第二个给定参数排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55228449/

10-11 12:18