Короткий ответ
NaN — это специальное число с плавающей точкой для обозначения отсутствующего числового значения, а None — обычный объект Python для отсутствующего значения; pandas обычно приводит оба к единообразному представлению пропуска в большинстве операций и методов вроде isna().
Как это работает подробнее
в числовом столбце (float64) None автоматически преобразуется в NaN при создании Series; в столбце типа object (например, со строками) None может храниться как есть, но isna() и isnull() всё равно корректно распознают и NaN, и None, и NaT (пропуск в датах) как пропущенные значения.
Пример кода
Пример Python
import pandas as pd
import numpy as np
s = pd.Series([1, None, np.nan, 'NaN'])
print(s.isna())Что использовать на практике
- На практике: для практических целей достаточно пользоваться isna()/notna(), которые унифицированно обрабатывают все виды пропусков, не разбираясь вручную в том, что именно хранится в ячейке; важно не путать пропуск с пустой строкой '' или текстовым "None" — это разные вещи, которые isna() не поймает без предварительной замены.
- Проверка: isna() вернёт True для второго и третьего элементов (None и np.nan), но False для последнего элемента — строки "NaN" как текста, что показывает необходимость явной нормализации текстовых пометок перед проверкой пропусков.
Подводные камни
- Частые ошибки: сравнивают значение с None напрямую через == None вместо pd.isna(), что не работает как ожидается для NaN (NaN == NaN даёт False); не замечают, что в столбце есть строковые "NaN"/"null"/"N/A" как текст, а не настоящий пропуск, и isna() их не находит.