【问题标题】:Drop duplicate if the value in another column is null - Pandas如果另一列中的值为空,则删除重复项 - Pandas
【发布时间】:2020-04-19 07:30:33
【问题描述】:

我有什么:

df

Name |Vehicle

Dave |Car
Mark |Bike
Steve|Car
Dave |
Steve|

我想从名称列中删除重复项,但前提是车辆列中的相应值为空。 我知道我可以使用

 df.dropduplicates(subset=['Name']) 

使用Keep ='First' or 'Last',但我正在寻找一种从Name 列中删除重复项的方法,其中Vehicle 列的对应值为null。所以基本上,如果 Vehicle 列是 NOT 为空,则保留 Name 并删除其余部分。如果名称没有重复,则保留该行,即使Vehicle 中的对应值为空。

非常感谢

【问题讨论】:

    标签: python pandas drop-duplicates


    【解决方案1】:

    我认为您需要使用Series.notnaSeries.duplicated 按位AND (&) 链接2个掩码:

    m1 = df['Vehicle'].notna()
    m2 = ~df['Name'].duplicated()
    
    df1 = df[m1 & m2]
    print (df1)
        Name Vehicle
    0   Dave     Car
    1   Mark    Bike
    2  Steve     Car
    

    如果想要单独执行这些操作 - 首先删除所有 NaN 行,然后删除重复项以避免测试 NaNs 行中的重复项(如有必要):

    df2 = df.dropna(subset=['Vehicle']).drop_duplicates('Name')
    print (df2)
        Name Vehicle
    0   Dave     Car
    1   Mark    Bike
    2  Steve     Car
    

    【讨论】:

    • 太棒了。伟大的逻辑!谢谢
    【解决方案2】:

    这将过滤掉None 和空值(如果有任何非None 或非空值),只保留Vehicle 遇到的第一个值

    import pandas as pd
    
    df = pd.DataFrame({"Name": ["Dave", "Mark", "Steve", "Dave", "Steve"], "Vehicle": ["Car", "Bike", "Car", None, ""]})
    
    res = df.sort_values("Vehicle", ascending=False).groupby("Name")["Vehicle"].first().reset_index()
    

    输出:

        Name Vehicle
    0   Dave     Car
    1   Mark    Bike
    2  Steve     Car
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-17
      • 1970-01-01
      • 2018-08-23
      • 2018-08-29
      • 2021-12-24
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多