如何根据另一列中的值过滤数据框中的重复列

How do you filter duplicate columns in a dataframe based on a value in another column

当列“代码”= 10 时,我想根据列“NID”、“Lact”和代码过滤 DataFrame 中的重复行。

以下数据为示例数据

data_list = {'NID': {1: '1', 2: '1', 3: '1', 4: '1', 5: '2', 6: '2', 7: '1'},
 'Lact': {1: 1, 2: 1, 3: 1, 4: 2, 5: 2, 6: 2, 7: 1},
            'Code': {1: 10, 2: 0, 3: 10, 4: 0, 5: 0, 6: 10, 7: 0}}

DataFrame出现在下方

  NID Lact  Code
1   1   1   10
2   1   1   0
3   1   1   10
4   1   2   0
5   2   2   0
6   2   2   10
7   1   1   0

如果我 运行 以下过滤器识别重复项,它会根据“NID”、“Lact”和“Code”识别重复行

df[(df.duplicated(['NID', 'Lact', 'Code'], keep=False))]

下面提供了输出

  NID Lact  Code
1   1   1   10
2   1   1   0
3   1   1   10
7   1   1   0

我想使此过滤器以 Code = 10 为条件,因为我想在代码 = 10 时删除重复行的第一个实例,但在代码不等于 10 时不删除

有没有办法为这个过滤器添加 Code == 10 的条件?

IIUC,如果 Code 不等于 10,您想保留所有行,否则删除第一个重复项,对吗?然后你可以将其添加到布尔掩码中:

cols = ['NID', 'Lact', 'Code']
out = df[~df.duplicated(cols, keep=False) | df.duplicated(cols) | df['Code'].ne(10)]

输出:

  NID  Lact  Code
2   1     1     0
3   1     1    10
4   1     2     0
5   2     2     0
6   2     2    10
7   1     1     0

如果条件 Code == 10 使用默认 keep='first' 参数将其与 DataFrame.duplicated 链接,如果需要删除第一个重复的行,并且如果需要还使用 [= 过滤所有重复链 m2 15=] 按位 AND:

m1 = df['Code'].eq(10)
m2 = df.duplicated(['NID', 'Lact', 'Code'], keep=False)
m3 = df.duplicated(['NID', 'Lact', 'Code'])


df = df[(~m1 | m3) & m2]
print (df)
  NID  Lact  Code
2   1     1     0
3   1     1    10
7   1     1     0