pandas duplicated keep=False: найти все повторяющиеся ключи

df.duplicated(subset=[...], keep=False) возвращает булеву маску: True стоит у каждой строки повторяющегося ключа, включая первое вхождение. Это отличается от keep="first", где первая строка группы не помечается дублем.

Короткий пример

import pandas as pd
df = pd.DataFrame({"id": [1, 1, 2], "amount": [5, 8, 3]})
mask = df.duplicated(subset=["id"], keep=False)
print(mask.tolist())
print(df.loc[~mask, "id"].tolist())

Результат:

[True, True, False]
[2]

Выбор subset определяет бизнес-ключ. Одинаковый id и разные суммы в этом примере всё равно образуют повторяющийся ключ. Если нужно оставить по одной строке группы, используйте другую политику; маска с keep=False исключает всю группу повторов.

Попробуйте самостоятельно

Ниже — отдельное задание с другими данными. Напишите решение и запустите проверку кода без регистрации. Для последовательного обучения откройте курс.

Документация.

Карантин дублей: keep=False, подсчёт удалённых строк и список выживших ключей

Что уже дано

Проверяющая система запускает вашу программу и подаёт данные через stdin. Никаких заранее созданных переменных нет — вы читаете всё сами.

Что нужно сделать

Напишите программу, которая диагностирует дубли в таблице транзакций и отправляет все строки с дублирующимся бизнес-ключом в «карантин»:

  1. Читает из stdin целое число n — количество строк таблицы.
  2. Читает следующие n строк; каждая содержит три токена через пробел: client_id (целое число), product (строка без пробелов), amount (целое число). Создаёт pd.DataFrame с именем df и столбцами 'client_id', 'product', 'amount'.
  3. Шаг A. Строит маску mask_all = df.duplicated(subset=['client_id', 'product'], keep=False) — помечает True все строки, у которых есть хотя бы один дубль по паре (client_id, product), включая первое вхождение. Выводит одну строку: quarantine_count=<k>, где k = mask_all.sum().
  4. Шаг B. Формирует df_quarantine = df[mask_all] — DataFrame со всеми строками-дублями. Выводит quarantine_shape=<shape> в виде (rows, cols).
  5. Шаг C. Формирует df_clean = df[~mask_all] — DataFrame из строк, у которых нет ни одного дубля по бизнес-ключу. Выводит clean_count=<m>, где m = df_clean.shape[0], и removed_count=<r>, где r = df.shape[0] - df_clean.shape[0].
  6. Шаг D. Проверяет, что в df_clean нет дублей по ['client_id', 'product']. Выводит clean_unique=<u>, где u = df_clean.duplicated(subset=['client_id', 'product']).sum().
  7. Шаг E. Для каждой строки df_clean (в порядке исходного индекса) выводит одну строку вида <client_id> <product>.

Ввод и вывод

Программа читает stdin и пишет в stdout.

Формат ввода

n
client_id1 product1 amount1
client_id2 product2 amount2
...

Дополнительные ограничения: n >= 1; таблица содержит явно описанные в условии столбцы.

Формат вывода

quarantine_count=<k>
quarantine_shape=(<rows>, <cols>)
clean_count=<m>
removed_count=<r>
clean_unique=<u>
<client_id> <product>
...

Пример

Ввод
7
1 Стол 500
2 Стул 300
1 Стол 550
3 Шкаф 200
2 Стул 320
4 Диван 800
1 Диван 100
Вывод
quarantine_count=4
quarantine_shape=(4, 3)
clean_count=3
removed_count=4
clean_unique=0
3 Шкаф
4 Диван
1 Диван
РешениеPython

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

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

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