Обработка и замена NaN на int в DataFrame Pandas
Быстрый ответ
Для интерпретации колонки с NaN значениями в pandas как типа nullable
целого числа (Int64
), воспользуйтесь следующей командой:
df['column'] = df['column'].astype('Int64')
Такое преобразование позволяет распознавать NaN
как пропущенные значения и проводить операции с целыми числами без возникновения ошибок.
Преобразование смешанных типов данных
Если в колонке датафрейма присутствуют числовые значения и NaN, их можно привести к целочисленному типу, предварительно преобразовав в float
, а затем в Int64
:
df['column'] = df['column'].astype(float).astype('Int64')
Это обеспечит корректное распознавание числовых данных перед преобразованием в формат nullable целого числа.
Интеллектуальная замена NaN
Если необходимо заменить NaN на определённое значение перед преобразованием колонки в int
, используйте следующую команду:
df['column'] = df['column'].fillna(0).astype('Int64')
Помните, что данное преобразование меняет NaN на нули, и это может повлиять на результаты анализа данных за счёт внесения информации, которая не существует изначально.
Визуализация
Можно представить процесс преобразования колонки Pandas с NaN в int
как замену в банке, наполненной фруктами и сладостями, конфет именно на фрукты:
Начальное содержимое (🍏🍬🍓🍬🍬🍬):
# 🍏🍓 — это числа, 🍬 — это NaN
После замены (🍏🍓🌰🌰🌰):
# Теперь все элементы представляют собой значения, 🌰 символизирует замену NaN
Используйте функцию pd.to_numeric()
с параметром downcast для приведения к "integer":
df['col'] = pd.to_numeric(df['col'], downcast='integer', errors='coerce').fillna(-1).astype(int)
Таким образом, NaN заменяются на целочисленные значения (🌰):
Конечное содержимое (🍏🍓🌰🌰🌰):
# Все данные теперь целочисленные, проблемы с NaN решены.
Погружение в детали
Вещественное число в качестве альтернативы
Если нет необходимости в строгом целочисленном типе данных, можно воспользоваться вещественным или float
:
df['column'] = df['column'].astype(float)
Работа с объектами
Для преобразования колонки типа object
, содержащей строки и NaN, следует в первую очередь обработать текстовые данные:
df['column'] = pd.to_numeric(df['column'], errors='coerce').astype('Int64')
С параметром errors='coerce'
текстовые значения преобразуются в NaN, затем их можно без проблем конвертировать в nullable целые числа.
Возврат к NaN
Если после замены и преобразования возникла необходимость вернуться к NaN, воспользуйтесь следующей командой:
df['column'] = df['column'].replace(-1, pd.NA)
Полезные материалы
- Nullable integer data type — документация pandas 2.2.0
- python – Как преобразовать колонку Pandas, содержащую NaN, в тип
int
– Stack Overflow - pandas.DataFrame.astype — документация pandas 2.2.0
- Работа со с пропущенными данными — документация pandas 2.2.0
- Модуль numpy.ma — Руководство NumPy v1.26
- Очистка данных в Python с использованием pandas и NumPy – Real Python