Pandas:根据条件删除一些重复值

Vin*_*ent 6 python duplicates pandas

我有一个数据集:

id    url     keep_if_dup
1     A.com   Yes
2     A.com   Yes
3     B.com   No
4     B.com   No
5     C.com   No
Run Code Online (Sandbox Code Playgroud)

我想删除重复项,即保留​​“url”字段的第一次出现,如果字段“keep_if_dup”为YES ,则保留重复项。

预期输出:

id    url     keep_if_dup
1     A.com   Yes
2     A.com   Yes
3     B.com   No
5     C.com   No
Run Code Online (Sandbox Code Playgroud)

我试过的:

Dataframe=Dataframe.drop_duplicates(subset='url', keep='first')
Run Code Online (Sandbox Code Playgroud)

这当然不考虑“keep_if_dup”字段。输出是:

id    url     keep_if_dup
1     A.com   Yes
3     B.com   No
5     C.com   No
Run Code Online (Sandbox Code Playgroud)

EdC*_*ica 6

您可以将多个布尔条件传递给loc,第一个保留 col 'keep_if_dup' == 'Yes' 的所有行,这是ored(使用|)与 col 'url' 列是否重复的倒置布尔掩码:

In [79]:
df.loc[(df['keep_if_dup'] =='Yes') | ~df['url'].duplicated()]

Out[79]:
   id    url keep_if_dup
0   1  A.com         Yes
1   2  A.com         Yes
2   3  B.com          No
4   5  C.com          No
Run Code Online (Sandbox Code Playgroud)

覆盖您的 df 自分配:

df = df.loc[(df['keep_if_dup'] =='Yes') | ~df['url'].duplicated()]
Run Code Online (Sandbox Code Playgroud)

分解上面显示了2个布尔掩码:

In [80]:
~df['url'].duplicated()

Out[80]:
0     True
1    False
2     True
3    False
4     True
Name: url, dtype: bool

In [81]:
df['keep_if_dup'] =='Yes'

Out[81]:
0     True
1     True
2    False
3    False
4    False
Name: keep_if_dup, dtype: bool
Run Code Online (Sandbox Code Playgroud)