pandas: типы столбцов и очистка по правилу

Пропуски в таблице: обнаружение, dropna, fillna и nullable dtype

Содержание курса

В числовых массивах NumPy пропуск в рассмотренном float-сценарии представлен как np.nan, и там его проверяют np.isnan(). Pandas работает с таблицами, где в одном DataFrame могут соседствовать числа, строки и булевы значения — и каждый тип хранит «отсутствие данных» по-своему: np.nan, None или pd.NA. Поэтому pandas предлагает единый интерфейс — isna/notna — который скрывает эти различия и даёт одинаковую маску вне зависимости от dtype столбца.

Обнаружение пропусков: isna, notna и подсчёт через sum

Первый шаг при работе с любыми реальными данными — понять, где именно чего-то не хватает. df.isna() возвращает DataFrame той же формы, но заполненный булевыми значениями: True там, где значение пропущено, False — где данные есть. df.notna() — прямая инверсия: True означает наличие данных.

Оба метода работают одинаково для DataFrame и для Series — форма результата всегда совпадает с формой исходного объекта.

Возьмём таблицу с явными пропусками в разных столбцах:

import pandas as pd

df = pd.DataFrame({
    'age':    pd.array([25, None, 32], dtype='Int64'),
    'salary': [50000.0, float('nan'), 75000.0],
    'dept':   ['IT', None, 'HR']
})

print(df.isna())

Результат:

     age  salary   dept
0  False   False  False
1   True    True   True
2  False   False  False

Здесь вся вторая строка пропущена. Но в реальных данных пропуски рассеяны, и смотреть на полную матрицу неудобно. Чтобы получить сводку по столбцам, достаточно применить .sum() — булевые значения трактуются как 0/1, и сумма даёт количество пропусков в каждом столбце:

print(df.isna().sum())
age       1
salary    1
dept      1
dtype: int64

Если хочется знать долю пропусков, а не абсолютное число, достаточно разделить на длину таблицы:

print(df.isna().sum() / len(df))

Это стандартный способ быстро оценить «засорённость» данных до того, как принимать решение — удалять строки или заполнять.

Ещё один полезный приём — df.isna().any(): возвращает Series с True по тем столбцам, где есть хоть один пропуск. Удобно для быстрой проверки, а не полного подсчёта:

print(df.isna().any())
age       True
salary    True
dept      True
dtype: bool

На уровне отдельного столбца series.isna() возвращает обычную булеву Series, которую можно сразу использовать для фильтрации. Например, чтобы посмотреть только строки, где salary пропущен:

print(df[df['salary'].isna()])

В результате получаем только строки с пропуском в salary — это удобно для ручной проверки или для отладки логики заполнения.

Диагностика через isna().sum() всегда должна быть первым шагом: она показывает масштаб проблемы и помогает решить, какой инструмент применять дальше — удалять записи или заполнять пропуски.

Пропуски в таблице: обнаружение, dropna, fillna и nullable dtype — NumPy и pandas: практический тренажёр — Latorn