【问题标题】: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】:
在布尔数组上使用 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】:
更改为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']
【解决方案4】:
您可以尝试对group 进行排序,它将首先具有DCM 值(默认升序),然后在drop_duplicates 方法中使用subset 和keep 选项:
df.sort_values('group').drop_duplicates(subset=['ID','date'], keep='last')