HOWTO · Python

ValueError: no se puede convertir NaN flotante a entero en Python

Este tutorial le enseñará a corregir ValueError: no se puede convertir NaN flotante a entero en Python.

En esta página

Una conversión como int(value) o una conversión de pandas a un tipo entero no puede representar NaN, un marcador de punto flotante que suele usarse para datos ausentes. El mensaje ValueError: cannot convert float NaN to integer describe ese problema de conversión; pandas puede generar, en cambio, pandas.errors.IntCastingNaNError, que a veces también menciona los infinitos. Decide si debes reemplazar o eliminar los valores afectados según lo que representen en tus datos.

Usar pandas fillna() para reemplazar NaN antes de convertir a enteros

Usa fillna() cuando debas conservar cada fila afectada y tengas un valor de reemplazo significativo. Reemplazar un precio ausente por 0 solo es adecuado si cero es un precio válido para tu aplicación. Este ejemplo autónomo compara rellenar un precio con un valor elegido, eliminar las filas cuyo precio falta y convertir un escalar de NumPy después de reemplazar NaN. El ejemplo mostrado se verificó: imprime [540, 0, 220], [540, 220] y 0.

Ejecuta este ejemplo:

import numpy as np
import pandas as pd

prices = pd.DataFrame({"item": ["A", "B", "C"], "price": [540.0, np.nan, 220.0]})
filled = prices.copy()
filled["price"] = filled["price"].fillna(0).astype(int)
remaining = prices.dropna(subset=["price"]).copy()
remaining["price"] = remaining["price"].astype(int)
scalar = int(np.nan_to_num(np.nan))
print(filled["price"].tolist())
print(remaining["price"].tolist())
print(scalar)

La primera lista conserva todas las filas y usa el valor de reemplazo elegido; la segunda omite la fila cuyo precio faltaba. La conversión del escalar muestra que numpy.nan_to_num() devuelve un escalar numérico que se puede pasar a int().

Usar pandas dropna() para eliminar filas con NaN antes de convertir a enteros

Usa dropna() cuando debas excluir del resultado las filas con valores ausentes. De forma predeterminada, dropna() elimina las filas que contienen valores ausentes en cualquier columna, lo que puede descartar datos que aún sean útiles. Pasa subset=["price"] para limitar la eliminación a la columna que planeas convertir, como en el ejemplo anterior. Después, convierte esa columna depurada con astype(int). Si conservar los registros es importante para tu análisis, comprueba cuántas filas quedan.

Usar numpy.nan_to_num() para reemplazar NaN antes de convertir a enteros

Para datos de NumPy, numpy.nan_to_num() reemplaza NaN por 0.0 de forma predeterminada; si necesitas otro valor, elige uno con el argumento nan. Convierte el escalar devuelto con int(...) o aplica la función a un arreglo antes de usar astype(int). No llames a .astype() sobre el escalar que devuelve numpy.nan_to_num(numpy.nan), porque no es un arreglo. Si los datos también contienen infinito positivo o negativo, trata esos valores de forma explícita: reemplazar NaN por sí solo no permite convertir los infinitos a enteros de manera segura. En pandas, revisa la columna afectada para detectar tanto valores ausentes como valores no finitos antes de elegir una regla de limpieza.