Нашли ошибку?
среднийpandas 3.0.6

Дубликаты

Найти, посчитать и удалить повторяющиеся строки — целиком или по выбранным столбцам.

Нужно знать:Фильтрация строк

Содержание статьи

Коротко

  • duplicated() — маска: True у строки, которая повторяет уже встречавшуюся.
  • drop_duplicates() удаляет повторы и возвращает новую таблицу.
  • subset — какие столбцы сравнивать; без него сравниваются все.
  • keep="first" (по умолчанию) оставляет первое вхождение, "last" — последнее, False — помечает или удаляет все повторяющиеся строки.
  • Число повторов — duplicated().sum().

Синтаксис

df.duplicated(subset=None, keep="first")
df.drop_duplicates(subset=None, keep="first", ignore_index=False)

Параметры

ПараметрЧто делаетПо умолчанию
subsetстолбец или список столбцов для сравнениявсе столбцы
keep"first", "last" или False — какие вхождения не считать повтором"first"
ignore_indexв drop_duplicates: новый индекс 0, 1, 2…False

Примеры

Данные для примеровиспользуются во всех примерах ниже
visits = pd.DataFrame({
    "user": ["ann", "bob", "ann", "kate", "bob", "ann"],
    "page": ["/home", "/cart", "/home", "/home", "/pay", "/cart"],
    "time": ["10:00", "10:02", "10:05", "10:06", "10:07", "10:09"],
})
Какие строки — повторы
visits.duplicated(subset=["user", "page"])        # True — повтор уже встречавшейся пары
Вывод
0    False
1    False
2     True
3    False
4    False
5    False
dtype: bool
Сколько повторов
visits.duplicated(subset=["user", "page"]).sum()
Вывод
np.int64(1)
Удалить повторы
visits.drop_duplicates(subset=["user", "page"])   # оставить первое вхождение
Вывод
   user   page   time
0   ann  /home  10:00
1   bob  /cart  10:02
3  kate  /home  10:06
4   bob   /pay  10:07
5   ann  /cart  10:09
Оставить последнее вхождение
visits.drop_duplicates(subset="user", keep="last")   # последнее посещение каждого пользователя
Вывод
   user   page   time
3  kate  /home  10:06
4   bob   /pay  10:07
5   ann  /cart  10:09
Все строки, у которых есть повтор
visits[visits.duplicated(subset="user", keep=False)]   # все строки пользователей с повторами
Вывод
  user   page   time
0  ann  /home  10:00
1  bob  /cart  10:02
2  ann  /home  10:05
4  bob   /pay  10:07
5  ann  /cart  10:09
Новый индекс после удаления
visits.drop_duplicates(subset="user", ignore_index=True)
Вывод
   user   page   time
0   ann  /home  10:00
1   bob  /cart  10:02
2  kate  /home  10:06

Подводные камни

Без subset повторов может не найтись

Если хотя бы один столбец различается (например, время), строки не считаются дубликатами. Укажите, по каким столбцам строка «та же самая».

Сравнение по всем столбцам
visits.duplicated().sum()                         # без subset сравниваются все столбцы
Вывод
np.int64(0)