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. Никаких заранее созданных переменных нет — вы читаете всё сами.
Что нужно сделать
Напишите программу, которая диагностирует дубли в таблице транзакций и отправляет все строки с дублирующимся бизнес-ключом в «карантин»:
- Читает из
stdinцелое числоn— количество строк таблицы. - Читает следующие
nстрок; каждая содержит три токена через пробел:client_id(целое число),product(строка без пробелов),amount(целое число). Создаётpd.DataFrameс именемdfи столбцами'client_id','product','amount'. - Шаг A. Строит маску
mask_all = df.duplicated(subset=['client_id', 'product'], keep=False)— помечаетTrueвсе строки, у которых есть хотя бы один дубль по паре(client_id, product), включая первое вхождение. Выводит одну строку:quarantine_count=<k>, гдеk = mask_all.sum(). - Шаг B. Формирует
df_quarantine = df[mask_all]— DataFrame со всеми строками-дублями. Выводитquarantine_shape=<shape>в виде(rows, cols). - Шаг 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]. - Шаг D. Проверяет, что в
df_cleanнет дублей по['client_id', 'product']. Выводитclean_unique=<u>, гдеu = df_clean.duplicated(subset=['client_id', 'product']).sum(). - Шаг 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 Диван
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- Дубли: duplicated и dropduplicates по ключевым столбцам — задача по NumPy и pandas
- pandas: удаление дубликатов — subset, keep first и last
- pandas: количество пропусков по столбцам — задача
- Описание схемы DataFrame: dtype, пропуски и уникальные значения
- pandas Series из словаря: index, shape и dtype
- pandas DataFrame из списка словарей: пример и задача
