我有一個包含三列的表格,其中兩列可以翻轉:
row A B Time
001 C1 DQ 300
002 C1 EG 355
003 DQ C1 300
004 DQ EG 400
005 IX Q2 410
006 Q2 IX 410
我想首先確定重復的行,然后再隨機保留 1 個重復的條目。
對于第一個測驗,顯然第 001 / 003 行和 005 / 006 是一對。但是,為了避免偏差,我希望有 50% 的概率保留第 001 行或第 003 行,并且在第二個配對中也是如此.
我的直覺是逐行回圈并創建一個 AB 行,如下按時間和隨機變數排序,然后選擇 where AB <> lAB。很明顯,看看下面的行,我最終會得到 4 個獨特的組合,隨機保留適當的 A 或 B 條目。
row AB lAB Time rand_val
001 C1DQ null 300 0.00031
003 C1DQ C1DQ 300 0.37647
002 C1EQ C1DQ 355 0.78345
004 DQEG C1EQ 400 0.63145
006 IXQ2 DQEG 410 0.21364
005 IXQ2 IXQ2 410 0.91462
不幸的是,我有一個很長的資料集,并且在我回圈創建 AB 時提取 A 和 B 的值將意味著多次傳遞和排序。有沒有更優化的“熊貓”方法來解決這個問題?
uj5u.com熱心網友回復:
從列創建排序的元組A,B然后用這個鍵對行進行分組,最后隨機保留一個:
groups = df[['A', 'B']].apply(lambda x: tuple(sorted(x)), axis=1)
out = df.groupby(groups).sample(n=1)
print(out)
# Output:
row A B Time
2 003 DQ C1 300
1 002 C1 EG 355
3 004 DQ EG 400
5 006 Q2 IX 410
關于groups:
>>> pd.concat([df[['A', 'B']], groups.rename('AB')], axis=1)
A B AB
0 C1 DQ (C1, DQ)
1 C1 EG (C1, EG)
2 DQ C1 (C1, DQ) # swap here
3 DQ EG (DQ, EG)
4 IX Q2 (IX, Q2)
5 Q2 IX (IX, Q2) # swap here
注意:@mozway建議使用frozenset而不是tuple(sorted(...)),所以替換:
groups = df[['A', 'B']].apply(lambda x: tuple(sorted(x)), axis=1)
經過:
groups = df[['A', 'B']].apply(frozenset, axis=1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/389500.html
上一篇:找到每個的平均值
