Ответ
Обработка пропусков — критичный этап. Я подхожу к ней в зависимости от природы данных и задачи.
Основные методы:
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(...).