[英]Is pandas sort_values() deterministic in case of ties?
我想知道 pandas 排序與sort_values()
是否是一個確定性操作,以防出現平局,即無論我多久運行一次,調用df.sort_values('foo')
是否總是返回相同的排序? 一個例子是
df=pd.DataFrame(np.random.randint(1, 3, 5),columns=["foo"])
df.sort_values(['foo'])
foo
0 1
4 1
1 2
2 2
3 2
我知道操作不穩定,但它是確定性的嗎?
是的。 如果您使用kind='quicksort'
,則 output 是確定性的,但不穩定。
快速排序可能是不確定的原因是所有快速排序實現都由三個步驟組成:
實施步驟 1 有三種流行的方法。
第一種方式是確定性的。 第二種和第三種方式是不確定的。
那么,Pandas 實現了哪種快速排序呢? Pandas將 sort_values() 分派給 sort_index(),后者使用 numpy 的 argsort()進行排序。 numpy如何實現采摘pivot? 這是在這個文件中定義的。
pivot 元素是vp
。 它是這樣選擇的:
/* quicksort partition */
pm = pl + ((pr - pl) >> 1);
[...]
vp = *pm;
這是如何運作的? 變量pr
和pl
分別是指向要排序的區域的開始和結束的指針。 如果將兩者相減,那就是要排序的元素數。 如果將其向左移動一次,則將其除以 2。因此pm
指針指向數組中間的一個元素。 然后取消引用pm
以獲得 pivot 元素。 (請注意,這不一定是數組的中間元素,它可能是最小的元素。或最大的。)
這意味着 numpy 使用第一種方法來選擇元素——它是任意的,但具有確定性。 對此的權衡是,對於某些數據排序,排序性能將從 O(N log N) 下降到 O(N^2)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.