Дубликаты в Pandas

Дубликаты — это полностью или частично повторяющиеся строки. Они появляются при повторной загрузке логов, ошибках merge или двойной отправке MQTT-сообщений. Pandas умеет искать их (duplicated) и удалять (drop_duplicates).

Когда использовать

  • Слили несколько CSV — нужно убрать «накладку» по времени.

  • ID устройства встречается дважды по ошибке.

  • Готовите датасет для уникального ML-обучения.

Пример 1. Поиск дубликатов

import pandas as pd

df = pd.DataFrame({"d": ["a", "a", "b", "a"], "v": [1, 1, 2, 1]})
print(df.duplicated())

Output:

0    False
1     True
2    False
3     True
dtype: bool

duplicated помечает повторы (первое вхождение остаётся False).

Пример 2. Удаление

import pandas as pd

df = pd.DataFrame({"d": ["a", "a", "b", "a"], "v": [1, 1, 2, 1]})
print(df.drop_duplicates())

Output:

   d  v
0  a  1
2  b  2

Пример 3. По подмножеству столбцов

import pandas as pd

df = pd.DataFrame({
    "d": ["a", "a", "b"],
    "t": [0, 1, 0],
    "v": [10, 11, 20],
})
print(df.drop_duplicates(subset=["d"]))

Output:

   d  t   v
0  a  0  10
2  b  0  20

Считается уникальной по d, остальные столбцы игнорируются.

Пример 4. keep

import pandas as pd

df = pd.DataFrame({"d": ["a", "a", "b"], "v": [1, 2, 3]})
print(df.drop_duplicates("d", keep="last"))

Output:

   d  v
1  a  2
2  b  3

keep="first" (по умолчанию), "last", False (удалить все повторы вообще).

Пример 5. keep=False

import pandas as pd

df = pd.DataFrame({"d": ["a", "a", "b"], "v": [1, 2, 3]})
print(df.drop_duplicates("d", keep=False))

Output:

   d  v
2  b  3

Все строки, у которых есть «двойник», выпадают.

Пример 6. Подсчёт

import pandas as pd

df = pd.DataFrame({"d": ["a", "a", "b"]})
print("дубликатов:", df.duplicated().sum())

Output:

дубликатов: 1

Пример 7. Дубликаты индекса

import pandas as pd

df = pd.DataFrame({"v": [1, 2, 3]}, index=["a", "a", "b"])
print(df[~df.index.duplicated()])

Output:

   v
a  1
b  2

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

  • По умолчанию drop_duplicates сравнивает ВСЕ столбцы — два почти одинаковых лога могут не считаться дубликатами из-за разницы в одной ячейке.

  • Float-сравнение чувствительно к шуму: 22.000001 и 22.000002 — разные. Округляйте перед поиском.

  • Дубликаты часто означают «событие повторилось», а не «ошибка». Перед удалением убедитесь, что это шум.

См. также

Примечание

Лицензия и источники

Техническое описание адаптировано из официальной документации Pandas (https://pandas.pydata.org/docs/), BSD-3-Clause License. Перевод на русский, примеры и пояснения — © AlashEd Wiki.