Короткий ответ
Пропуски заполняют через fillna() значением, статистикой (mean, median) или методом распространения соседних значений (ffill/bfill); выбор зависит от природы данных и причины пропуска.
Как это работает подробнее
fillna(value) подставляет заданное значение везде, где NaN; fillna(df['col'].median()) подставляет медиану столбца; ffill/bfill берут последнее известное или следующее значение, что уместно для временных рядов.
Пример кода
Пример Python
import pandas as pd
df = pd.DataFrame({'price': [100, 150, None, 90000, 120]})
median_fill = df['price'].fillna(df['price'].median())
mean_fill = df['price'].fillna(df['price'].mean())
print(median_fill.tolist(), mean_fill.tolist())Что использовать на практике
- На практике: среднее подходит для симметричных распределений без сильных выбросов, медиана устойчивее к выбросам и асимметрии; константу (например, 0 или "unknown") используют, когда пропуск сам по себе содержателен (например, скидки не было); перед выбором метода стоит понять, почему значение отсутствует.
- Проверка: заполнение медианой даст более разумное значение (около 125), тогда как заполнение средним будет сильно искажено выбросом 90000.
Подводные камни
- Частые ошибки: автоматически заполняют все числовые пропуски средним без проверки распределения, искажая дисперсию и корреляции; заполняют пропуски до разделения на train/test в задачах моделирования, что приводит к утечке информации; путают, что fillna() без inplace=True не изменяет исходный DataFrame, если результат не сохранён в переменную.