![](/img/trans.png)
[英]How to find duplicates in a python list that are adjacent to each other and list them with respect to their indices?
[英]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.