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' на таблице измерений:

  1. Читает из stdin целое число n — количество строк таблицы.
  2. Читает следующие n строк; каждая содержит три токена через пробел: device (строка без пробелов), date (строка вида YYYY-MM-DD), reading (целое число). Создаёт pd.DataFrame с именем df и столбцами 'device', 'date', 'reading'.
  3. Шаг A. Применяет df.drop_duplicates(subset=['device', 'date'], keep='first'), сохраняет в df_first. Выводит first_rows=<n> — число строк результата.
  4. Шаг B. Применяет df.drop_duplicates(subset=['device', 'date'], keep='last'), сохраняет в df_last. Выводит last_rows=<n> — число строк результата.
  5. Шаг C. Проверяет уникальность обоих результатов. Выводит first_dups=<k> и last_dups=<k>, где k — результат df_first.duplicated(subset=['device', 'date']).sum() и аналогично для df_last.
  6. Шаг 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
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи