Гид по технологиям

Как заполнить пропущенные значения в pandas

5 min read Аналитика данных Обновлено 06 Dec 2025
Заполнение пропусков в pandas: способы и методология
Заполнение пропусков в pandas: способы и методология

Руки печатают на клавиатуре; на столе блокнот с надписью Python

Введение

Очистка данных занимает большую часть времени в проектах с данными. Пропущенные значения (NaN) и пустые ячейки часто мешают анализу и обучению моделей. pandas — основной инструмент в Python для манипуляций с табличными данными. Он предлагает простые и гибкие способы заполнить или заменить пропуски.

В этой статье вы получите практическое руководство по нескольким подходам к импутации в pandas. Примеры используют DataFrame, похожий на реальную небольшую выборку, и моменты, когда один метод предпочтительнее другого.

Подготовка окружения и пример данных

Установите pandas в виртуальное окружение командой:

pip install pandas

Можно работать с любым источником: CSV, Excel, базой данных. Для примера используем смоделированный DataFrame с пропусками.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'A': [0, 3, np.nan, 10, 3, np.nan],
    'B': [np.nan, np.nan, 7.13, 13.82, 7, 7],
    'C': [np.nan, "Pandas", np.nan, "Pandas", "Python", "JavaScript"],
    'D': ["Sound", np.nan, np.nan, "Music", "Songs", np.nan]
})

print(df)

Таблица DataFrame в консоли с пропущенными значениями

Короткие определения терминов:

  • Пропуск (NaN): отсутствующее значение в ячейке DataFrame.
  • Импутация: процесс заполнения пропусков значениями.

Основные методы в pandas

Ниже — практические способы заполнить пропущенные значения. Для каждого метода указаны плюсы и минусы и примеры кода.

1. fillna(): простая и гибкая замена

fillna заполняет пропуски указанным значением или значениями по колонкам. Подходит для массовых замен и быстрой корректировки DataFrame.

Ключевые параметры:

  • value — значение или словарь {столбец: значение} для замены.
  • method — ‘ffill’ или ‘bfill’ для копирования соседних значений.
  • inplace — если True, изменяет исходный DataFrame.

Заполнение средним, медианой, модой

Для числовых столбцов удобно вставлять mean/median. Для строковых — mode.

# Вставить среднее по числовым столбцам
df.fillna(df.mean(numeric_only=True).round(1), inplace=True)

# Вставить медиану по числовым столбцам
df.fillna(df.median(numeric_only=True).round(1), inplace=True)
print(df)

Примечание: numeric_only=True гарантирует, что средние считаютcя только по числовым колонкам.

Чтобы заполнить строковые столбцы модой:

string_columns = df.select_dtypes(include=['object']).columns
# mode() может вернуть DataFrame, поэтому берем первую строку
df[string_columns] = df[string_columns].fillna(df[string_columns].mode().iloc[0])

# Или конкретно по столбцу C:
df['C'].fillna(df['C'].mode()[0], inplace=True)

Можно комбинировать правила по столбцам:

df.fillna({
    'A': df['A'].mean(),
    'B': df['B'].median(),
    'C': df['C'].mode()[0]
}, inplace=True)
print(df)

Плюсы: простота, прозрачность. Минусы: затирает распределение, если замена однотипная.

2. Метод ffill и bfill

Forward-fill (ffill) копирует значение сверху вниз. Backward-fill (bfill) — снизу вверх. Полезно для временных рядов или когда соседние значения логично продолжать.

# Заполнить значениями выше
df.fillna(method='ffill', inplace=True)

# Или заполнить значениями ниже
df.fillna(method='bfill', inplace=True)

Часто используют ffill, затем bfill, чтобы заполнить обе стороны:

df.fillna(method='ffill', inplace=True)
df.fillna(method='bfill', inplace=True)

Плюсы: сохраняет локальную согласованность. Минусы: может повторять аномалии и не подходит, если пропуски большие по длине.

3. replace(): замена любых значений

replace полезен, когда нужно заменить не только NaN, но и другие маркеры отсутствия (‘’, ‘NA’, -999 и т. п.).

# Пример: заменить np.nan в колонке A на среднее
df['A'].replace([np.nan], df['A'].mean(), inplace=True)

replace поддерживает словари и регулярные выражения. Используйте, если данные содержат кастомные метки отсутствия.

4. interpolate(): числовая интерполяция

interpolate вычисляет недостающие значения на основе соседних чисел. Подходит для числовых рядов с естественным порядком.

# Линейная интерполяция, направление backward или forward
df.interpolate(method='linear', limit_direction='backward', inplace=True)
df.interpolate(method='linear', limit_direction='forward', inplace=True)

Плюсы: сохраняет тренды, хорошо для временных рядов. Минусы: не подходит для категориальных данных.

Дополнительные подходы и альтернативы

5. Удаление строк или столбцов (dropna)

Иногда проще удалить строки или столбцы с пропусками. Удаление оправдано, если доля пропусков мала и удаление не приведёт к смещению выборки.

# Удалить строки с любыми NaN
df.dropna(axis=0, how='any', inplace=True)

# Удалить столбцы, где больше чем 50% пропущено
threshold = len(df) * 0.5
df.dropna(axis=1, thresh=threshold, inplace=True)

Важно: перед удалением проанализируйте, какие записи вы потеряете.

6. Импутация с помощью sklearn (SimpleImputer и IterativeImputer)

Для моделей можно использовать sklearn.impute.SimpleImputer или IterativeImputer из sklearn. Они помогают строить более осмысленные замены и интегрируются в pipeline.

from sklearn.impute import SimpleImputer
import numpy as np

imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean')
num_cols = df.select_dtypes(include=[np.number]).columns

df[num_cols] = imp_mean.fit_transform(df[num_cols])

IterativeImputer (многомерная импутация) строит модель для предсказания пропусков на основе остальных признаков. Он мощнее, но медленнее.

7. Модельные методы и специальные библиотеки

  • Используйте KNNImputer для заполнения на основе близких наблюдений.
  • Для сложных форм пропусков подходят модели типа MICE (многократная имputation).
  • Библиотеки: fancyimpute, missingpy — реализуют дополнительные алгоритмы.

Когда метод не подойдёт (контрпримеры)

  • fillna(mean) может искажать дисперсию и снизить эффективность моделей, чувствительных к распределению.
  • ffill/bfill плохи, если пропуск длинный и предыдущие/последующие значения не релевантны.
  • Interpolate не применим к категориальным данным.
  • Удаление строк опасно при системных пропусках (например, пропуски зависят от целевой переменной).

Всегда проверяйте изменения с помощью визуализации и статистик (mean, std, распределение).

Практическая методология: как принять решение

Мини-методология (шаги):

  1. Оцените долю пропусков по колонкам.
  2. Проверьте, зависят ли пропуски от других признаков (Missingness pattern).
  3. Для чисел: визуализируйте распределение и решите — mean/median/interpolate/model.
  4. Для категорий: рассмотрите mode или специальную метку ‘Unknown’.
  5. Оцените влияние на модель через валидацию.

Mermaid: простое дерево решений для выбора метода

flowchart TD
  A[Есть пропуски?] -->|Нет| B[Ничего не делать]
  A -->|Да| C[Тип данных]
  C -->|Числовые| D{Доля пропусков}
  C -->|Категориальные| E{Доля пропусков}
  D -->|Мала '<5%'| F[fillna'mean/median']
  D -->|Средняя| G[interpolate / SimpleImputer / model]
  D -->|Большая| H[удалить столбец или специальная имputation]
  E -->|Мала| I[mode или замена на 'Unknown']
  E -->|Большая| J[групповая замена или удаление]

Ролевые чек-листы

Аналитик:

  • Проверить процент пропусков.
  • Построить гистограммы и boxplot для чисел.
  • Протестировать fillna(mean) и fillna(median).

Data Scientist:

  • Оценить зависимость пропусков от таргета.
  • Попробовать IterativeImputer/KNN.
  • Проверить стабильность метрик на валидации.

Инженер данных:

  • Очистить источники данных.
  • Стандартизировать метки отсутствия (NA, ‘’, -999).
  • Зафиксировать правила в ETL pipeline.

Критерии приёмки

  • Входной датасет не содержит NaN в тех столбцах, где это критично.
  • Импутация не ухудшает метрики на проверочном наборе данных.
  • Правила импутации задокументированы и воспроизводимы.

Короткий глоссарий (1 строка)

  • Импутация: заполнение пропущенных значений на основе правил или моделей.

Риски и рекомендации

  • Не используйте одну стратегию для всех колонок без анализа.
  • Визуализируйте данные до и после импутации.
  • Для production — фиксируйте pipeline и версии библиотек.

Часто задаваемые вопросы

Можно ли заменять NaN на 0?

Да, но это допустимо, только если 0 логично для признака (например, количество предметов). Иначе 0 может исказить анализ.

Как выбрать mean или median?

Если распределение нормально и без сильных выбросов — mean. При наличии выбросов — median.

Что делать с пропусками в категориальных признаках?

Часто используют mode, метку “Unknown” или создают отдельную категорию, означающую отсутствие данных.

Краткое резюме

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

Важное: всегда документируйте выбранный подход и сохраняйте копию необработанных данных.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство