методы обработки пропусков данных в Pandas

Поиск, анализ и методы обработки пропусков данных в Pandas

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

Создание тестового DataFrame

Для начала создадим тестовый DataFrame с пропусками:

import pandas as pd
import numpy as np

data = {
    'Age': [25, 32, np.nan, 45, 28, np.nan, 35],
    'Salary': [50000, 54000, 52000, np.nan, 58000, np.nan, 61000],
    'City': ['NY', 'LA', None, 'SF', 'TX', 'NV', 'WA']
}

df = pd.DataFrame(data)

Поиск пропусков

Чтобы определить, где у нас пропущенные значения, используем isna() или isnull().

print(df.isna())

#      Age  Salary   City
# 0  False   False  False
# 1  False   False  False
# 2   True   False   True
# 3  False    True  False
# 4  False   False  False
# 5   True    True  False
# 6  False   False  False

Количество пропусков

Чтобы определить количество пропусков в каждом столбце:

print(df.isna().sum())

# Age       2
# Salary    2
# City      1
# dtype: int64

Удаление строк или столбцов с пропусками

Если количество пропусков невелико, строки с ними можно удалить:

df_cleaned = df.dropna()

Удалить столбцы:

df_cleaned_columns = df.dropna(axis=1)

Заполнение пропусков

Замена всех пропусков конкретным значением:

df_filled = df.fillna(0)

Заполнение средним значением по столбцу:

df['Age'].fillna(df['Age'].mean(), inplace=True)

Заполнение медианой:

df['Salary'].fillna(df['Salary'].median(), inplace=True)

Использование метода ffill (forward fill) для заполнения предыдущим значением:

df['City'].fillna(method='ffill', inplace=True)

Интерполяция

Еще один метод — интерполяция, особенно полезна для временных рядов:

df['Age'].interpolate(method='linear', inplace=True)

Применение метода bfill (backward fill)

Также, как и метод ffill, который заполняет пропуски предыдущим значением, bfill заполняет пропуски последующим значением:

df['City'].fillna(method='bfill', inplace=True)

Использование категориальных данных

Если у вас есть категориальные данные, вы можете заполнить пропуски наиболее часто встречающейся категорией:

most_common = df['City'].mode()[0]
df['City'].fillna(most_common, inplace=True)

Групповое заполнение

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

df['Salary'] = df.groupby('City')['Salary'].transform(lambda x: x.fillna(x.median()))

Проверка на отсутствие пропусков

После всех преобразований убедитесь, что пропусков нет:

assert df.notna().all().all(), "There are still missing values!"

Заключение

Работа с пропусками — ключевой этап в предварительной обработке данных. Неверное или непродуманное их заполнение может исказить результаты анализа. Всегда стоит задаваться вопросом о причинах возникновения пропусков и выбирать методы их обработки в зависимости от контекста данных.

Содержание: