pandas: типы столбцов и очистка по правилу

Дубли: 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'. В обоих случаях нужно убедиться, что данные отсортированы так, как ожидается, иначе «первое» и «последнее» вхождение окажутся случайными — и сохранится не та запись, что нужна.