February 6, 2022

Удобная визуализация частичных дубликатов в Python

Методы выявления и фильтрации дубликатов (duplicated, drop_duplicates) в библиотеке Pandas я уже освещал ранее. Вместе с тем для исследования объектов с частью одинаковых значений и понимания сути расхождений требуются дополнительные знания в части более тонкого применения функций и комбинации с другими методами.

Рассмотрим вопрос на примере игрушечного датафрейма следующего вида:

import pandas as pd
df = pd.DataFrame([['Калашников', 'Павел', 'Москва'],
                  ['Авдеева', 'Серафима', 'Новгород'], 
                  ['Магомедов', 'Ислам', 'Махачкала'],
                  ['Павленко', 'Сергей', 'Киев'],
                  ['Ибрагимов', 'Ислам', 'Махачкала'],
                  ['Купеев', 'Павел', 'Москва']],columns=['surname' ,'name', 'city'])
df

Обычный вызов duplicated приведет к пометке в качестве дубликатов и выводу только части данных (по умолчанию первые вхождения не выводятся):

Чтобы получить все дубликаты, воспользуйтесь параметром keep со значением False:

Однако, в некоторых случаях требуется сравнить объекты по части одинаковых полей (частичные дубликаты). При этом, если данных много, для удобства дополнительно воспользуйтесь сортировкой:

df[df.duplicated(subset = 'city', keep=False)].sort_values(by='city')

Другим способом нахождения дубликатов по некоторым полям является группировка:

df.groupby(['city', 'name'])['surname'].apply(lambda x: set(x)).reset_index()

В вышеуказанном примере мы заключаем изучаемое поле (в котором дубликаты расходятся) в множество, чтобы исключить получение одинаковых значений.