2017-09-15 157 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