【问题标题】:Pandas : remove SOME duplicate values based on conditionsPandas:根据条件删除一些重复值
【发布时间】:2016-07-26 16:02:00
【问题描述】:

我有一个数据集:

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

我想删除重复项,即保留​​第一次出现的“url”字段,BUT如果字段“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

我尝试了什么:

Dataframe=Dataframe.drop_duplicates(subset='url', keep='first')

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

id    url     keep_if_dup
1     A.com   Yes
3     B.com   No
5     C.com   No

【问题讨论】:

    标签: python pandas duplicates


    【解决方案1】:

    您可以将多个布尔条件传递给 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
    

    覆盖您的 df 自我分配:

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

    分解上面显示了 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
    

    【讨论】:

    • 谢谢,这个命令是修改“df”数据框还是应该使用:df = df.loc[...] 来保存它?
    • 如果你想覆盖你的 df 然后自行分配回df= df.loc....
    • 好的,这就是我的意思,感谢您编辑您的答案
    • @EdChum 这是一个很棒的答案,帮助我解决了类似的问题。我仍在尝试将头绕在或倒置的布尔表达式部分上。这是说if keep_if_dup == YES or df['url] is not duplicated吗?我一直在寻找类似于if keep_if_dup == 'YES' then drop duplicates 的解决方案,所以只是想围绕它。非常感谢!
    猜你喜欢
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多