Дубли: duplicated и drop_duplicates по ключевым столбцам
Содержание курса
drop_duplicates: удаление дублей с явным subset и keep
Когда duplicated() показал группы совпадений по ключу и вы убедились, что этот ключ действительно должен быть уникален, можно переходить к удалению. drop_duplicates() возвращает новый DataFrame, в котором из каждой группы совпадений остаётся ровно одна строка — в соответствии с выбранным keep.
Синтаксис симметричен duplicated(): те же параметры subset и keep, тот же смысл:
import pandas as pd
df = pd.DataFrame({
'user_id': [1, 2, 1, 3, 2],
'action': ['login', 'buy', 'login', 'view', 'buy'],
'amount': [0, 100, 0, 50, 200]
})
key_cols = ['user_id', 'action']
# keep='first' — оставить первое вхождение каждой группы
df_first = df.drop_duplicates(subset=key_cols, keep='first')
print(df_first[['user_id', 'action', 'amount']].values.tolist())
# [[1, 'login', 0], [2, 'buy', 100], [3, 'view', 50]]
# keep='last' — оставить последнее вхождение
df_last = df.drop_duplicates(subset=key_cols, keep='last')
print(df_last[['user_id', 'action', 'amount']].values.tolist())
# [[1, 'login', 0], [3, 'view', 50], [2, 'buy', 200]]
Разница между двумя вариантами наиболее заметна по паре (2, 'buy'): при keep='first' остаётся строка с amount=100 (индекс 1), при keep='last' — строка с amount=200 (индекс 4). Для user_id=1 результат внешне одинаков в обоих случаях — не потому что у этого пользователя нет дублей, а потому что оба вхождения пары (1, 'login') полностью идентичны, включая amount=0: неважно, какое из них сохранить. Строка user_id=3 не имеет совпадений по ключу и присутствует в результате без изменений.
drop_duplicates() не меняет исходный DataFrame. Результат — новый объект, его нужно присвоить переменной. Вызов без присвоения ничего не изменит.
Выбор между keep='first' и keep='last' определяется логикой данных: если строки упорядочены по времени и нужна самая свежая запись — берёшь keep='last'; если важна первая зафиксированная — keep='first'. В обоих случаях нужно убедиться, что данные отсортированы так, как ожидается, иначе «первое» и «последнее» вхождение окажутся случайными — и сохранится не та запись, что нужна.
