【问题标题】:Remove duplicates based on multiple criteria根据多个条件删除重复项
【发布时间】:2022-08-15 09:21:48
【问题描述】:

根据多个条件删除重复项 根据多个条件删除重复项

    标签: python pandas dataframe


    【解决方案1】:

    识别缺失的名称并打印 ID:

    print(f"Missing names: {', '.join(df.loc[df['name'].isna(), 'ID'].astype(str))}")
    # Missing names: 379, 579
    

    fillna 名称,然后获取每组的第一个非 NA(或第一个 NA,如果没有):

    df2 = df.assign(name=df['name'].fillna('ID/'+df['ID'].astype(str)))
    
    df2 = df2.loc[df2['verified'].notna().groupby(df['ID'], sort=False).idxmax()]
    
    print(df2)
    

    输出:

         name   ID  verified
    0     joe  123     213.0
    3    mary  342     643.0
    5     sam  214       NaN
    7    jack  992       NaN
    8  ID/379  379       NaN
    9  ID/579  579       NaN
    

    【讨论】:

    • 感谢您的答复。这对我来说很有效,但它需要很长时间才能在 1500 万行上运行。有没有办法优化这个?
    【解决方案2】:

    根据所有或选定的列在数据框中查找重复行。

    # Selecting duplicate rows except first
    # occurrence based on all columns
    duplicate = df[df.duplicated(keep = 'first')]
    

    【讨论】:

      【解决方案3】:

      这是我尽力回答您的问题的尝试。这个想法是结合单独的数据框来得出所需的答案。

      # Generate Data
      data_dict = {
          'name': ['joe', 'sally', 'sarah', 'mary', 'adam', 'sam', 'jill', 'jack', np.nan, np.nan],
          'ID': [123, 123, 342, 342, 342, 214, 214, 992, 379, 579],
          'verified': [213, np.nan, np.nan, 643, 932, np.nan, np.nan, np.nan, np.nan, np.nan]
      }
      df = pd.DataFrame(data_dict)
      
      # First Part of the Answer
      for idx, row in df.iterrows():
          if isinstance(row['name'], float):
              row = row.copy()
              df.at[idx, 'name'] = row['ID']
              
      # Second Part of the Answer
      a = df.dropna().drop_duplicates(subset=['ID'])
      id_a = a['ID'].unique()
      b = df[df['verified'].isna()].drop_duplicates(subset=['ID'])
      c = b[b['ID'].apply(lambda x: x not in id_a)]
      
      pd.concat([a,c])
      
      

      答案的第一部分地址“如果他们没有名称值,只需将 NaN 替换为 ID 值。”并且答案的第二部分解决了“我想取那些重复项中的任何一个在“已验证”列中具有值。如果该列中有多行具有值,则只需取具有已验证值的第一行. 如果所有重复项都没有经过验证的行,则只保留第一个重复项。重要的是所有行都有一个名称值。

      【讨论】:

        【解决方案4】:

        您可以使用sort_valueskey = lambda x: x != '' 来根据verified 列是否有值对行进行排序。然后将参数keep = 'first' 赋予df.duplicated 将保留具有非空值的行(如果存在)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-02-17
          • 1970-01-01
          • 2014-03-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-04
          相关资源
          最近更新 更多