簡體   English   中英

如何識別列中彼此相鄰的重復項?

[英]how to identify duplicates adjacent to each other in a column?

以下面的數據框為例,如何識別彼此相鄰的重復項並將信息添加到另一列?

  G_NUM  PRIM   P_NUM   
0  15     True    135
1  9      False   147
2  9      True    264
3  9      False   537
4  2      False   154
5  10     False   222
6  10     False   370
7  10     False   188
8  14     True    215

我希望輸出顯示為以下DF。 PRI列具有一個元組,用於存儲序列號,組中元素的總數以及組中的優先級。

對於第0行(G_NUM = 5),組中只有一個,因此它是1/1,並且元組的最后一個元素保持優先級,在這種情況下為1。 我想將PRI列設置為(1,1,1)。

對於第1-3行(G_Num = 9),有3個行,因此分別為1 / 3、2 / 3和3/3。 對於優先級,我希望那些PRIM = True具有更高的優先級。 如果兩個相鄰的成員具有相同的PRIM狀態,則第一個出現的成員具有更高的優先級。

如何做到這一點? 謝謝!

  G_NUM  PRIM   P_NUM   PRI
0  15     True    135   (1,1,1)
1  9      False   147   (1,3,2)
2  9      True    264   (2,3,1)
3  9      False   537   (3,3,3)
4  2      False   154   (1,1,1)
5  10     False   222   (1,3,1)
6  10     False   370   (1,3,2)
7  10     False   188   (1,3,3)
8  14     True    215   (1,1,1)

一旦有了上述第一個df ,就可以像這樣使用df.groupby

In [1]: grouped = df.groupby('G_NUM').PRIM
In [2]: tuples = list(zip(grouped.cumcount() + 1, grouped.transform(len), grouped.transform(lambda x: np.argsort(~x.values, kind='mergesort')+1)))
In [3]: tuples 
Out[3]: [(1, 1, 1),
         (1, 3, 2),
         (2, 3, 1),
         (3, 3, 3),
         (1, 1, 1),
         (1, 3, 1),
         (2, 3, 2),
         (3, 3, 3),
         (1, 1, 1)]

由您決定如何將其恢復為原始df 請注意您的問題中的兩個錯誤:(1) df的第一個G_NUM為15而不是5;(2)第5-7行的PRI序列等級索引錯誤,因為它們不遞增。

您應該閱讀Pandas split-apply-combine技術。 上面我的代碼中的zip元素具有以下目的:

  • pd.cumcount()計算給定元素之前有多少個項目,並將其應用於grouped對象將此計算投影到每個組上。
  • grouped.transform(len)計算每個組中元素的數量,並將其作為每個給定觀察值的標量值產生。
  • grouped.transform(lambda x: np.argsort(~x.values)+1)處理您的優先級規范: np.argsort在列表中查找給定元素的排名-換句話說,它給出了在其下的排列該列表將被排序。 通過將argsort應用於〜x.values,我們以降序排序。 (我不知道是否真的需要kind關鍵字;我堅持對mergesort進行排序,以使排序穩定,因此只要PRIM值相等,原始順序就會優先;目前我不記得是否quicksort通過使用numpy作為其默認被修飾成穩定的或沒有)。

暫無
暫無

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

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