2017-09-15 59 views
0

我想從給定一些相當複雜的編碼的數據框中刪除重複項。考慮數據幀根據Python中的多個interpendant條件刪除重複項

df = pd.DataFrame({'id' : [1, 1, 1, 1, 2, 2, 2, 3, 3], 
        'dup' : [1, 2, 2, 2, 3, 4, 4, 5, 5], 
        'a' : [False, True, False, True, False, True, False, False, False], 
        'b' : [False, False, True, True, False, False, False, False, False], 
        'data' : [0, 1, 2, 3, 0, 1, 2, 0, 0]}) 


     a  b data dup id 
0 False False  0 1 1 
1 True False  1 2 1 
2 False True  2 2 1 
3 True True  3 2 1 
4 False False  0 3 2 
5 True False  1 4 2 
6 False False  2 4 2 
7 False False  0 5 3 
8 False False  0 5 3 

id指示哪些行屬於在一起並dup是在其上數據被視爲複製的變量。所以,0到3行屬於一起,1到3行是重複的。和行相若方式4〜6屬於一起,行5和6是重複等

我想根據以下規則,以便移除重複:

  1. ,如果存在一個行,使得兩個柱a AND列bTrue,保留該行並放棄其餘部分。
  2. 條件1不會發生,如果存在行,使得其中任何一列a或列bTrue,保留該行並刪除其餘
  3. 如果沒有1或2情況下,請重複的行之一。哪個並不重要。

將所得幀應該是這樣的

 a  b data dup id 
0 False False  0 1 1 
3 True True  3 2 1 
4 False False  0 3 2 
5 True False  1 4 2 
7 False False  0 5 3 

關於情況下兩個以上的重複的行服從這樣

 a  b data dup id 
0 False False  0 3 2 
1 True False  1 4 2 
2 False True  2 4 2 

根據真實其中兩個行1和2是相同的規則規則2.根據導致數據框的邏輯,這些情況是不可能的。

回答

2

給你:

df=df.sort_values(by=['dup','a','b'],ascending=[True,False,False]) 
df=df.drop_duplicates(subset='dup',keep='first') 

首先我整理對於您的規則行:由DUP,然後把第一隻是那些真正的「A」(也可能是對「B」太) 。然後刪除與'dup'相關的重複行,保持第一次遇到。

+1

不錯!簡短而甜美。謝謝。 – mortysporty