簡體   English   中英

pandas sort_values() 在平局的情況下是否具有確定性?

[英]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. 選擇一個 pivot 元件。
  2. 將列表分為兩個列表:小於 pivot 的元素和大於 pivot 的元素。
  3. 對列表的兩半運行快速排序。

實施步驟 1 有三種流行的方法。

  1. 第一種方式是任意挑一個pivot元素,比如挑第一個元素,或者中間元素。
  2. 第二種方法是隨機選擇一個元素。
  3. 第三種方法是隨機選擇幾個元素,並計算中位數(或中位數的中位數)。

第一種方式是確定性的。 第二種和第三種方式是不確定的。

那么,Pandas 實現了哪種快速排序呢? Pandas將 sort_values() 分派給 sort_index(),后者使用 numpy 的 argsort()進行排序。 numpy如何實現采摘pivot? 這是在這個文件中定義的。

pivot 元素是vp 它是這樣選擇的:

/* quicksort partition */
pm = pl + ((pr - pl) >> 1);
[...]
vp = *pm;

這是如何運作的? 變量prpl分別是指向要排序的區域的開始和結束的指針。 如果將兩者相減,那就是要排序的元素數。 如果將其向左移動一次,則將其除以 2。因此pm指針指向數組中間的一個元素。 然后取消引用pm以獲得 pivot 元素。 (請注意,這不一定是數組的中間元素,它可能是最小的元素。或最大的。)

這意味着 numpy 使用第一種方法來選擇元素——它是任意的,但具有確定性。 對此的權衡是,對於某些數據排序,排序性能將從 O(N log N) 下降到 O(N^2)。

有關實施快速排序的更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM