Очистка данных в Pandas
«Грязные» данные — это не миф: лог датчика может содержать пропуски, дубликаты, строки вместо чисел, неправильные форматы дат. До анализа их нужно привести к вменяемому виду. В Pandas есть набор инструментов для каждого случая.
Пять основных задач
Пропуски: Пропуски (NaN) в Pandas
Дубликаты: Дубликаты в Pandas
Неверные значения (выбросы): Неверные значения и выбросы
Неверные форматы (типы): Неверные форматы данных
Лишние пробелы/регистр в строках: Строки в 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.