2013-10-25 24 views
3

熊貓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 

回答

3

大熊貓正在執行indirect sort,我相信這是numpy的的quicksort。該算法涉及交換物品的位置。一旦它們按要求的順序停止(在這種情況下,它不涉及檢查索引,因爲你沒有要求檢查該列)。 Quicksort比天真的排序算法更有效率,比如bubble sort,這可能是你的想法 - 它會讓單個數字更接近它們的原始順序,但需要更多的步驟來完成。

+0

謝謝,你知道這種行爲最近是否發生了變化(排序的實施方式)嗎? –

+0

那麼,你可以看到自己的變化,但主要是他們是輕微的,在2013年幾乎沒有:https://github.com/pydata/pandas/blame/master/pandas/core/frame.py#L2591如果你切換您可以在github上查看版本,查看它們之間的代碼差異,或查看更改列表:http://pandas.pydata.org/pandas-docs/stable/whatsnew.html。我懷疑這種排序算法是否改變過。 – foobarbecue

+1

因此,只要看看這個,熊貓數據框在0.11.0和0.12.0之間的表現方式有一些變化。當你調用sort時,它會調用sort_index。 sort_index基本上將工作傳遞給np.argsort()。在0.11.0中,它調用的argsort沒有我能看到的特定種類,但在0.12.0中它使用quicksort來調用它,使用kind = quicksort。作者對早期大熊貓的快速排序很謹慎。 –

3

其實,如果你看看source code of pandas DataFrame,你會看到sort()僅僅是一個不同的參數的sort_index()包裝,正如@Jeff說this questionsort_index()是使用首選方法。

如果您僅按一列排序,則使用numpy.argsort()和缺省kind=quicksort的sort_index()方法。而quicksort()不是stable,這就是爲什麼你的索引看起來亂了。

但是你可以通過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 

現在的排序是穩定的,但索引按升序排列