这是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
答案 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
值通常看起来是唯一的,所以每个组最终只有一个成员,这意味着每个组中没有什么可以排序的。