2016-09-07 65 views
7

我注意到,也有pd.DataFrame.groupby幾種用途後跟apply隱含假設groupbystable - 也就是說,如果一個b是同組的情況下,和預分組,一個b之前出現,然後a將在分組之後出現在b之前。pandas.DataFrame.groupby是否保證穩定?

我認爲有幾個答案明確隱含地使用這個,但具體來說,這裏是one using groupby+cumsum

有沒有什麼實際上有希望這種行爲?該文件只規定:使用映射

系列集團(字典或鍵功能,適用於給定功能分組,返回結果爲系列)或通過一系列的列。

另外,具有索引的熊貓,理論上也可以在沒有這種保證的情況下實現功能(儘管以更麻煩的方式)。

+0

對不起你要問,如果兩行說'了'和'B'必須是他們保證在相同的順序分組後相同的值?我敢肯定,我已經看到,雖然他們執行穩定的代碼,我不得不再次找到這個代碼 – EdChum

+0

@EdChum是的,如果我正確理解你。如果行* a *和* b *與分組標準相同(它們將最終在同一組中),它們是*保證*是否保留其分組後的順序。我一直在實踐中看到它,但有些擔心文檔似乎不能保證這一點。 –

+0

我一直都看到過這種行爲,從來沒有見過任何其他類型的行爲,文檔沒有指定或保證這一點並不會影響我,但我已經看到,雖然通過代碼大量的評論和參考執行穩定排序,這對我來說是合乎邏輯的,因爲如果分組決定改變原始順序,那麼替代方法就是將'transform'這樣的函數合併回原始df索引 – EdChum

回答

6

儘管文檔沒有在內部聲明,但它在生成組時使用穩定排序。

參見:

正如我在評論中提到的,這一點,如果你考慮transform將返回一系列與它的指數對準原來的DF是非常重要的。如果排序不保留訂單,那麼這將使對齊執行額外的工作,因爲在分配之前需要對Series進行排序。事實上,這種被提及in the comments

_algos.groupsort_indexer器具計數排序,它是至少 O(ngroups),其中

ngroups = prod(shape)

shape = map(len, keys)

即,線性的數量組合(笛卡爾產品)的唯一 groupby鍵的值。做多鍵groupby時,這可能很大。 np.argsort(kind='mergesort')O(count x log(count))其中count是數據幀的長度的 ; 這兩種算法都是穩定排序和這是正確的 groupby操作所必需的。

例如考慮: df.groupby(key)[col].transform('first')