pandas: удаление дубликатов — subset, keep first и last
drop_duplicates удаляет повторные строки pandas. Параметр subset определяет, какие столбцы считать ключом, а keep выбирает, какую из повторных строк сохранить.
Сначала определите, что считается дублем
Две покупки одного клиента в один день могут быть разными событиями. Если поставить subset=["client", "date"], они станут дублями по этому ключу, даже если суммы отличаются. Без subset сравниваются все столбцы.
keep="first" сохраняет первую строку в текущем порядке, keep="last" — последнюю, keep=False удаляет все строки повторяющихся групп. «Последняя» не означает «самая свежая», пока таблица не отсортирована по времени. Метод duplicated(..., keep=False) помогает предварительно увидеть все конфликтующие строки.
Пример на других данных
import pandas as pd
df = pd.DataFrame({"sku": ["A", "A", "B"], "price": [10, 12, 20]})
print(df.drop_duplicates("sku", keep="first")["price"].tolist())
print(df.drop_duplicates("sku", keep="last")["price"].tolist())
print(df.duplicated("sku", keep=False).tolist())
Результат:
[10, 20]
[12, 20]
[True, True, False]
Попробуйте сами
Ниже — отдельное упражнение: напишите код и запустите проверку. Другие упражнения по этой теме. Для обучения по порядку откройте бесплатный курс NumPy и pandas.
keep='first' vs keep='last': сравнение сохранённых значений после дедупликации
Что уже дано
Проверяющая система запускает вашу программу и подаёт данные через stdin. Никаких заранее созданных переменных нет — вы читаете всё сами.
Что нужно сделать
Напишите программу, которая сравнивает результаты дедупликации с keep='first' и keep='last' на таблице измерений:
- Читает из
stdinцелое числоn— количество строк таблицы. - Читает следующие
nстрок; каждая содержит три токена через пробел:device(строка без пробелов),date(строка видаYYYY-MM-DD),reading(целое число). Создаётpd.DataFrameс именемdfи столбцами'device','date','reading'. - Шаг A. Применяет
df.drop_duplicates(subset=['device', 'date'], keep='first'), сохраняет вdf_first. Выводитfirst_rows=<n>— число строк результата. - Шаг B. Применяет
df.drop_duplicates(subset=['device', 'date'], keep='last'), сохраняет вdf_last. Выводитlast_rows=<n>— число строк результата. - Шаг C. Проверяет уникальность обоих результатов. Выводит
first_dups=<k>иlast_dups=<k>, гдеk— результатdf_first.duplicated(subset=['device', 'date']).sum()и аналогично дляdf_last. - Шаг D. Для каждой пары
(device, date), которая встречалась в исходномdfболее одного раза (в порядке первого появления вdf_firstпо индексу), выводит одну строку вида<device> <date> first=<r1> last=<r2>, гдеr1— значение'reading'изdf_firstдля этой пары,r2— изdf_last.
Ввод и вывод
Программа читает stdin и пишет в stdout.
Формат ввода
n device1 date1 reading1 device2 date2 reading2 ...
Дополнительные ограничения: n >= 1; таблица содержит явно описанные в условии столбцы.
Формат вывода
first_rows=<n>
last_rows=<n>
first_dups=<k>
last_dups=<k>
<device> <date> first=<r1> last=<r2>
...
Пример
- Ввод
7 S1 2024-01-01 10 S2 2024-01-01 20 S1 2024-01-01 11 S3 2024-01-02 30 S2 2024-01-01 21 S1 2024-01-03 12 S3 2024-01-02 31
- Вывод
first_rows=4 last_rows=4 first_dups=0 last_dups=0 S1 2024-01-01 first=10 last=11 S2 2024-01-01 first=20 last=21 S3 2024-01-02 first=30 last=31
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- Дубли: duplicated и dropduplicates по ключевым столбцам — задача по NumPy и pandas
- pandas duplicated keep=False: найти все повторяющиеся ключи
- pandas: количество пропусков по столбцам — задача
- Описание схемы DataFrame: dtype, пропуски и уникальные значения
- pandas Series из словаря: index, shape и dtype
- pandas DataFrame из списка словарей: пример и задача
