我有一个数据集,我想根据某些条件删除重复项。
例如,假设我有一张表
ID date group
3001 2010 DCM
3001 2012 NII
3001 2012 DCM
我想说看ID栏 对于类似的ID,如果两个日期相似 保持组是NII的行
所以它会变成
ID date group
3001 2010 DCM
3001 2012 NII
答案 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)
在布尔数组上使用iloc
和argsort
。确保使用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
值(默认情况下升序),然后使用subset
和keep
drop_duplicates
方法中的选项:
df.sort_values('group').drop_duplicates(subset=['ID','date'], keep='last')