如何使用列表条件性地从Pandas DataFrame中删除重复项

4

我有一个df,想要根据ID删除所有的重复项。

       Name     Symbol         ID
0   ZOO INC     Remove  88579Y101
1   Zoo Inc        ZZZ  88579Y101
2     A Inc        AAA  90138A103
3     a inc.    Remove  90138A103
4    2U Inc       TWUO  90214J101
5      Keep     Remove  111111111

但我只想删除其中Symbol == 'Remove'的重复行。输出应如下:

       Name     Symbol         ID
0   Zoo Inc        ZZZ  88579Y101
1     A Inc        AAA  90138A103
2    2U Inc       TWUO  90214J101
3      Keep     Remove  111111111

由于数据集没有特定的模式,所以不能使用result_df = df.drop_duplicates(subset=['ID'], keep='first')(或keep='last')。而且先按字母顺序排序也没有帮助。

虽然我知道我可以将所有的Remove替换为NaN,然后使用这里提供的解决方案,但我正在寻找另一种解决方案,因为我最终可能需要传递一个字符串列表。

Pandas是否支持像这样的操作:result_df = df.drop_duplicates(subset=['ID'], keep=(df['Symbol'] != 'Remove'))?


3
这段代码的意思是从DataFrame中选择符号列不等于"Remove"的行。 - Quang Hoang
但是这样不会删除所有 Symbol == 'Remove' 的行吗?我只想删除那些在 ID 上重复的行。我会更新问题以使其更清晰。 - user53526356
那并不反映在您的样本数据上。但是,Jezrael的答案已经涵盖了这一点。 - Quang Hoang
1个回答

4

使用keep=FalseSeries.duplicated查找所有重复值,并通过比较将其与Remove链在一起,使用按位OR|连接,通过~反转掩码:

m1 = df['ID'].duplicated(keep=False)
m2 = (df['Symbol'] == 'Remove')

df = df[~(m1 & m2)]

print (df)
      Name Symbol         ID
1  Zoo Inc    ZZZ  88579Y101
2    A Inc    AAA  90138A103
4   2U Inc   TWUO  90214J101
5     Keep     Remove  111111111

1
你可能也想在输出中显示ID 111111111(这是棘手的部分,但你的技巧可以实现,所以我会点赞)。 - DarrylG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接