Очистка данных в Pandas

«Грязные» данные — это не миф: лог датчика может содержать пропуски, дубликаты, строки вместо чисел, неправильные форматы дат. До анализа их нужно привести к вменяемому виду. В Pandas есть набор инструментов для каждого случая.

Пять основных задач

  1. Пропуски: Пропуски (NaN) в Pandas

  2. Дубликаты: Дубликаты в Pandas

  3. Неверные значения (выбросы): Неверные значения и выбросы

  4. Неверные форматы (типы): Неверные форматы данных

  5. Лишние пробелы/регистр в строках: Строки в Pandas (.str)

Пример 1. Быстрый осмотр

import pandas as pd

df = pd.DataFrame({
    "device": ["bot1", "bot2", None, "bot1"],
    "temp": [22.1, 35.4, 19.8, 22.1],
})
print(df.info())
print("дубликатов:", df.duplicated().sum())
print("пропусков:", df.isna().sum().sum())

Output:

<class 'pandas.core.frame.DataFrame'>
...
дубликатов: 1
пропусков: 1

Пример 2. Удаление пропусков

import pandas as pd
import numpy as np

df = pd.DataFrame({"v": [1, np.nan, 3]})
print(df.dropna())

Output:

     v
0  1.0
2  3.0

Пример 3. Заполнение пропусков

import pandas as pd
import numpy as np

df = pd.DataFrame({"v": [1, np.nan, 3]})
print(df.fillna(0))

Output:

     v
0  1.0
1  0.0
2  3.0

Пример 4. Удаление дубликатов

import pandas as pd

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

Output:

   d  v
0  a  1
2  b  2

Пример 5. Приведение типа

import pandas as pd

df = pd.DataFrame({"v": ["1", "2", "3"]})
df["v"] = df["v"].astype(int)
print(df.dtypes)

Output:

v    int64
dtype: object

Пример 6. Очистка строк

import pandas as pd

df = pd.DataFrame({"name": ["  Temp ", "HUM", " press "]})
df["name"] = df["name"].str.strip().str.lower()
print(df)

Output:

   name
0  temp
1   hum
2 press

Пример 7. Цепочка очистки

import pandas as pd
import numpy as np

df = pd.DataFrame({
    "temp": ["22", "35", "??", "41"],
    "device": [" bot1", "bot2", "bot1", "bot2"],
})
df["temp"] = pd.to_numeric(df["temp"], errors="coerce")
df["device"] = df["device"].str.strip()
df = df.dropna(subset=["temp"]).drop_duplicates()
print(df)

Output:

   temp device
0  22.0   bot1
1  35.0   bot2
3  41.0   bot2

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

  • Очистка «по месту» (inplace=True) теряет промежуточные состояния — для отладки лучше работать через новые переменные.

  • Не удаляйте дубликаты до проверки — иногда они означают повторные события, а не ошибку логирования.

  • pd.to_numeric(..., errors="coerce") тихо превращает «битые» в NaN — не забудьте проверить, что не выбросили лишнего.

См. также

Примечание

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

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