Pandas - drop_duplicates具有多个条件

时间:2018-05-10 02:39:20

标签: python pandas dataframe duplicates

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

例如,假设我有一张表

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

我想说看ID栏 对于类似的ID,如果两个日期相似 保持组是NII的行

所以它会变成

ID  date    group
3001    2010    DCM
3001    2012    NII

4 个答案:

答案 0 :(得分:5)

在此处利用duplicated

df[~df.duplicated(['ID', 'date'], keep=False) | df['group'].eq('NII')]

     ID  date group
0  3001  2010   DCM
1  3001  2012   NII

答案 1 :(得分: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 :(得分:3)

在布尔数组上使用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 :(得分:2)

您可以尝试对group进行排序,首先会有DCM值(默认情况下升序),然后使用subsetkeep drop_duplicates方法中的选项:

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