当有平局时,大熊猫如何决定排序?

时间:2013-10-25 04:04:26

标签: python pandas

Pandas 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

2 个答案:

答案 0 :(得分:6)

实际上,如果您查看source code of pandas DataFrame,您会发现sort()只是sort_index()的包装器,具有不同的参数,并且正如@Jeff所述{{3} },this question是首选使用的方法。

如果您只按一列排序,则使用sort_index()并使用默认kind=quicksort的sort_index()方法。 numpy.argsort()不是quicksort(),这就是您的索引看起来混乱的原因。

但是您可以将kind参数传递给sort_index()('mergesort''quicksort''heapsort'之一),这样您就可以使用稳定排序({{1} })为你的任务:

'mergesort'

sort_index()也使用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 参数中有一列更多,这很有趣,例如,你可以这样做:

by

现在排序稳定,但索引按升序排序

答案 1 :(得分:4)

熊猫正在使用numpy的quicksort。 Quicksort涉及交换项目的位置。它一旦处于请求的顺序就会停止(在这种情况下,不涉及检查索引,因为您没有要求检查该列)。 Quicksort比诸如bubble sort之类的天真排序算法更有效率,这可能是你想到的 - 它会使单个数字更接近原始顺序,但需要更多步骤才能完成。