根据Python中的多个互连条件删除重复项

时间:2017-09-15 09:27:40

标签: python pandas duplicates

我想从一个数据帧中删除重复项,给出一些相当精细的编码。考虑数据框

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和列bTrue,请保留该行并删除其余行。
  2. 如果条件1没有发生,如果存在一行,使得列a或列bTrue,则保留该行并删除其余行
  3. 如果1或2都不发生,请保留其中一个重复的行。无关紧要。
  4. 结果框架应如下所示

           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
    

    根据规则2,第1行和第2行都是真的。根据数据帧的逻辑,这些情况是不可能的。

1 个答案:

答案 0 :(得分:2)

你在这里:

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

首先,我根据您的规则对行进行排序:通过dup,然后首先将True加在'a'上(也可能放在'b'上)。然后删除关于'dup'的重复行,保持第一次遇到。