【问题标题】:Pandas - drop_duplicates with multiple conditionsPandas - 具有多个条件的 drop_duplicates
【发布时间】:2018-10-20 05:44:00
【问题描述】:

我有一个数据集,我想根据某些条件删除重复项。

例如,假设我有一个表格

ID  date    group
3001    2010    DCM
3001    2012    NII
3001    2012    DCM

我想说看看 ID 列 对于相似的 ID,如果两个日期相似 保留组为 NII 的行

它会变成

ID  date    group
3001    2010    DCM
3001    2012    NII

【问题讨论】:

    标签: python pandas dataframe duplicates


    【解决方案1】:

    在这里利用duplicated

    df[~df.duplicated(['ID', 'date'], keep=False) | df['group'].eq('NII')]
    
         ID  date group
    0  3001  2010   DCM
    1  3001  2012   NII
    

    【讨论】:

      【解决方案2】:

      在布尔数组上使用 ilocargsort。确保使用mergesort 进行排序以确保非易失性排序。

      df.iloc[df.group.ne('NII').argsort(kind='mergesort')].drop_duplicates(['ID', 'date'])
      
           ID  date group
      1  3001  2012   NII
      0  3001  2010   DCM
      

      这将确保在 ['ID', 'date'] 对的组中,带有 'NII' 的行始终排在第一位。

      【讨论】:

        【解决方案3】:

        更改为Categorical,然后更改为sort_values + drop_duplicates

        df['group']=pd.Categorical(df['group'], ["NII", "DCM"])
        df.sort_values('group').drop_duplicates(['ID', 'date'])
             ID  date group
        1  3001  2012   NII
        0  3001  2010   DCM
        

        如果您有超过 2 个,请将 ["NII", "DCM"] 替换为以下

        ["NII"]+df.group.loc[lambda x : x!='NII'].unique().tolist()
        ['NII', 'DCM']
        

        【讨论】:

        • 我建议扩展它以处理超过 2 个类别。
        【解决方案4】:

        您可以尝试对group 进行排序,它将首先具有DCM 值(默认升序),然后在drop_duplicates 方法中使用subsetkeep 选项:

        df.sort_values('group').drop_duplicates(subset=['ID','date'], keep='last')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-19
          • 2022-01-23
          • 2021-04-06
          • 1970-01-01
          • 2022-06-11
          • 2018-06-28
          • 2021-05-16
          • 2017-11-18
          相关资源
          最近更新 更多