Панды - drop_duplicates с несколькими условиями - PullRequest
0 голосов
/ 10 мая 2018

У меня есть набор данных, в котором я хочу удалить дубликаты на основе некоторых условий.

Например, скажем, у меня есть таблица как

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

Я хочу сказать, посмотри в столбец ID для одинаковых идентификаторов, если две даты были похожи сохранить строку этой группы NII

так бы и стало

ID  date    group
3001    2010    DCM
3001    2012    NII

Ответы [ 4 ]

0 голосов
/ 10 мая 2018

Использование 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' всегда будут на первом месте.

0 голосов
/ 10 мая 2018

Вы можете попробовать выполнить сортировку по group, сначала она будет иметь значение DCM (по умолчанию по возрастанию ), затем с использованием опции subset и keep в методе drop_duplicates:

df.sort_values('group').drop_duplicates(subset=['ID','date'], keep='last')
0 голосов
/ 10 мая 2018

Изменить на 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']
0 голосов
/ 10 мая 2018

Кредитное плечо duplicated здесь:

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

     ID  date group
0  3001  2010   DCM
1  3001  2012   NII
...