← Назад к вопросам
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(), если:
- Нужна сложная логика сравнения
- Работаешь с частичными совпадениями