8

熊猫 0.12.0

在下面的 DataFrame 中,为什么它会混淆索引?查看 4,索引从 1、15、6、7 开始。大熊猫用来决定如何排序的推理是什么,我怀疑索引会保持相同值的顺序。

mydf=pd.DataFrame(np.random.randint(1, 6, 20),columns=["stars"])
mydf.sort(['stars'], ascending=False)


     stars
19   5
14   5
1    4
15   4
6    4
7    4
4    3
12   3
18   3
8    2
2    2
9    2
10   2
11   2
13   2
16   2
5    1
3    1
17   1
0    1
4

2 回答 2

10

实际上,如果您查看pandas DataFrame 的源代码,您会发现sort()只是具有不同参数的sort_index()包装器,并且正如@Jeff 在这个问题中所说,sort_index()是首选方法利用。

如果您仅按一列排序,则sort_index() 方法使用numpy.argsort()和 default 。kind=quicksort而且quicksort()不稳定,这就是为什么你的索引看起来被打乱了

但是您可以将kind参数传递给 sort_index()(其中之一'mergesort',, 'quicksort', ),因此您可以为您的任务'heapsort'使用稳定的排序( ):'mergesort'

>>> mydf.sort_index(by=['stars'], ascending=False, kind='mergesort')
    stars
17      5
11      5
6       5
1       5
19      4
18      4
15      4
14      4
7       4
5       4
2       4
10      3
8       3
4       3
16      2
12      2
9       2
3       2
13      1
0       1

sort_index() 如果by参数中有超过一列,也使用合并排序(或计数排序),这很有趣,例如,您可以这样做:

>>> mydf.sort_index(by=['stars', 'stars'], ascending=False)
    stars
1       5
6       5
11      5
17      5
2       4
5       4
7       4
14      4
15      4
18      4
19      4
4       3
8       3
10      3
3       2
9       2
12      2
16      2
0       1
13      1

现在排序是稳定的,但是索引是升序排序的

于 2013-10-27T07:42:30.297 回答
7

Pandas 正在使用 numpy 的快速排序。快速排序涉及交换项目的位置。一旦它们处于请求的顺序中,它就会停止(在这种情况下,不涉及检查索引,因为您没有要求检查该列)。快速排序比冒泡排序之类的简单排序算法效率更高,这可能是您的想法——它会使各个数字更接近其原始顺序,但需要更多步骤才能做到这一点。

于 2013-10-25T04:42:16.463 回答