Как в pandas DataFrame обработать или заменить пропущенные значения (NaN)?

«Как в pandas DataFrame обработать или заменить пропущенные значения (NaN)?» — вопрос из категории Pandas и NumPy, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Обработка пропусков — критичный этап. Я подхожу к ней в зависимости от природы данных и задачи.

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

1. Удаление строк/столбцов с пропусками (dropna) Использую, когда пропусков мало и их потеря не исказит данные.

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [1, 2, np.nan], 'B': [5, np.nan, np.nan], 'C': [1, 2, 3]})

# Удалить строки, где ВСЕ значения NaN
df.dropna(how='all')
# Удалить строки, где ХОТЯ БЫ одно значение NaN
df.dropna(how='any')
# Удалить строки, где NaN в конкретном столбце
df.dropna(subset=['A'])
# Удалить столбцы, содержащие только NaN
df.dropna(axis=1, how='all')

2. Заполнение пропусков (fillna) Это более частый сценарий.

# Заполнить все пропуски константой
df.fillna(0)

# Заполнить разными значениями для разных столбцов
df.fillna({'A': df['A'].mean(), 'B': 'missing', 'C': df['C'].median()})

# Продвижение значений (forward fill / backward fill)
df.fillna(method='ffill')  # заполняет значением из предыдущей строки
df.fillna(method='bfill')  # заполняет значением из следующей строки
# Полезно для временных рядов

# Заполнение с ограничением (только 1 пропуск подряд)
df.fillna(method='ffill', limit=1)

3. Более сложные стратегии

  • Интерполяция: Для числовых рядов с естественным порядком.
    df['A'].interpolate(method='linear')  # линейная интерполяция
  • Заполнение на основе других признаков: Использую SimpleImputer из sklearn или создаю собственную модель для предсказания пропущенных значений.

Важное правило: Я никогда не применяю inplace=True в рабочих пайплайнах, чтобы не потерять исходные данные. Всегда создаю новую копию или присваиваю результат новой переменной: df_clean = df.fillna(...).