September 23, 2022

Рассеиваем туман вокруг параметра keep при работе с дубликатами в Pandas

Основными методами для работы с дубликатами в Pandas являются duplicated и drop_duplicates, принимающие набор колонок, по которым определяются дубли и параметр keep. Проясним смысл последнего.

Сначала создадим демонстрационный датафрейм:

import pandas as pd

df = pd.DataFrame({'id':[1,2,3,4,5,6,7], 'name':[1,2,2,2,1,4,3]})
df

Многие путаются в назначении параметра keep в разных методах, например, часто оно трактуется "как сохранение в выводе", однако это не так. Корректнее воспринимать keep, как то, что не будет считаться дублем. Например, в методе duplicated он говорит - "не помечай как дубли первые вхождения ('first'), последние ('last'), ничего (False)". Вот результат с keep='first':

df.duplicated('name', keep='first')

Соответственно, проиндексировав датафрейм с duplicated, мы как раз первые повторы (и уникальные значения) в выводе не получим:

df[df.duplicated('name', keep='first')]

Значение keep=False помечает все как дубликаты:

df.duplicated('name', keep=False)

keep=False удобен для изучения всех дублей, часто его применяют вместе с сортировкой по повторам, чтобы визуально было легче их сравнивать:

df[df.duplicated('name', keep=False)].sort_values(by='name')

Для drop_duplicates отсутствие метки дубля будет означать, что такое значение не удалится (сохранится):

df.drop_duplicates('name', keep='first')

А так удалятся все повторы:

df.drop_duplicates('name', keep=False)

Таким образом, параметр keep трактуем, как определяющий, что не помечать как повтор, а итоговый результат уже зависит от конкретного метода - либо удаляющего все повторы, либо просто отмечающего меткой True.