Pandas - 使用多个条件去除重复项

5

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

例如,假设我有一个表格如下:

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个回答

11

在这里使用 duplicated 来发挥杠杆作用:

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

     ID  date group
0  3001  2010   DCM
1  3001  2012   NII

6

在布尔数组上使用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

如果你有超过两个,将["NII", "DCM"]替换为以下内容。
["NII"]+df.group.loc[lambda x : x!='NII'].unique().tolist()
['NII', 'DCM']

1
我建议将其扩展以处理超过2个类别。 - cs95

2

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接