← Назад к вопросам

Python: Найти дубликаты в датасете

1.0 Junior🔥 181 комментариев
#Pandas и обработка данных#Python

Условие

Дан DataFrame в pandas.

Напишите код на Python для поиска всех дубликатов в датасете.

Покажите несколько способов решения.

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение

Способ 1: Встроенный метод duplicated()

Самый простой и быстрый способ — использовать встроенный метод duplicated():

import pandas as pd

# Создание примера датасета
df = pd.DataFrame({
    "id": [1, 2, 3, 2, 4, 1],
    "name": ["Alice", "Bob", "Charlie", "Bob", "David", "Alice"],
    "age": [25, 30, 35, 30, 28, 25]
})

# Способ 1: Найти все дубликаты (не обозначает первое появление)
duplicates = df[df.duplicated()]
print("Дубликаты (keep=False):")
print(df[df.duplicated(keep=False)].sort_values(by="id"))

# Вариант 1a: Сохранить первое появление
duplicates_first = df[df.duplicated(keep="first")]
print("\nДубликаты (keep=first):")
print(duplicates_first)

# Вариант 1b: Сохранить последнее появление
duplicates_last = df[df.duplicated(keep="last")]
print("\nДубликаты (keep=last):")
print(duplicates_last)

Способ 2: Поиск дубликатов по конкретным столбцам

Часто нужно найти дубликаты только по определённым колонкам:

# Поиск дубликатов только по столбцу name
dup_by_name = df[df.duplicated(subset=["name"], keep=False)].sort_values("name")
print("\nДубликаты по столбцу name:")
print(dup_by_name)

# Поиск дубликатов по нескольким столбцам
dup_multi = df[df.duplicated(subset=["id", "age"], keep=False)]
print("\nДубликаты по столбцам id и age:")
print(dup_multi)

Способ 3: Использование value_counts() и groupby()

Для более детального анализа дубликатов:

# Подсчёт количества дубликатов по столбцу
dup_counts = df["id"].value_counts()
dup_ids = dup_counts[dup_counts > 1].index
duplicates_group = df[df["id"].isin(dup_ids)].sort_values("id")
print("\nДубликаты (через value_counts):")
print(duplicates_group)

# Группировка для анализа
print("\nКоличество дубликатов по id:")
for id_val in dup_ids:
    count = len(df[df["id"] == id_val])
    print(f"  ID {id_val}: {count} строк")

Способ 4: Использование groupby() с размером группы

# Найти все группы, где размер > 1
dup_groups = df.groupby(list(df.columns), dropna=False).size()
dup_indices = dup_groups[dup_groups > 1].index
duplicates_all = df[df.set_index(list(df.columns)).index.isin(dup_indices)]
print("\nДубликаты (через groupby):")
print(duplicates_all)

Способ 5: Использование merge() для самосоединения

# Самосоединение для поиска полных дубликатов
df_with_idx = df.reset_index(drop=True).reset_index()
merged = df_with_idx.merge(df_with_idx, on=list(df.columns), how="inner")
duplicates_merge = merged[merged["index_x"] < merged["index_y"]]
print("\nДубликаты (через merge):")
print(duplicates_merge[list(df.columns)])

Сравнение методов

СпособСкоростьУдобствоГибкость
duplicated()ОтличнаяОтличнаяХорошая
value_counts()ХорошаяХорошаяОтличная
groupby()СредняяХорошаяОтличная
merge()ПлохаяСредняяХорошая

Рекомендации

Используй duplicated(), если:

  • Нужен быстрый результат
  • Работаешь с большими датасетами
  • Дубликаты определяются по всем столбцам или небольшому набору

Используй value_counts() или groupby(), если:

  • Нужен анализ количества дубликатов
  • Дубликаты по специфическим колонкам
  • Нужна дополнительная статистика

Используй merge(), если:

  • Нужна сложная логика сравнения
  • Работаешь с частичными совпадениями
Python: Найти дубликаты в датасете | PrepBro