HOWTO · NumPy
Cómo eliminar valores NaN de un array de NumPy
Aprende a eliminar valores NaN de un array de NumPy en Python
En esta página
Para eliminar los elementos NaN de un array de NumPy, crea una máscara que sea verdadera para los valores que no sean NaN y úsala para seleccionar esos elementos. Con un array de NumPy, la forma concisa es array[~np.isnan(array)].
Eliminar valores NaN con las funciones logical_not() e isnan() de NumPy
np.isnan(array) devuelve un array booleano con True en las posiciones cuyos elementos son NaN. np.logical_not() invierte esos valores, de modo que la máscara resultante es True para los números normales. La indexación booleana conserva los elementos que coinciden con la máscara y mantiene su orden original. El operador ~ es la forma abreviada equivalente para este array booleano de NumPy.
Este ejemplo muestra ambas formas y también qué ocurre cuando la entrada contiene solo valores NaN o no contiene ninguno:
import numpy as np
values = np.array([1.0, np.nan, 3.0])
without_nan = values[np.logical_not(np.isnan(values))]
without_nan_short = values[~np.isnan(values)]
all_nan = np.array([np.nan, np.nan])
no_nan = np.array([1, 2, 3])
print(without_nan)
print(without_nan_short)
print(all_nan[~np.isnan(all_nan)])
print(no_nan[~np.isnan(no_nan)])
[1. 3.]
[1. 3.]
[]
[1 2 3]
Las dos máscaras producen los mismos valores filtrados. Si la entrada contiene únicamente NaN, el resultado es un array vacío; si no contiene ninguno, el array permanece igual. Consulta la documentación oficial de np.logical_not() y la de np.isnan().
Eliminar valores NaN con la función isfinite() de NumPy
np.isfinite(array) crea una máscara que es verdadera para los números finitos. Al indexar con ella se eliminan los NaN, pero también los infinitos positivos y negativos. Usa esta función cuando necesites conservar solo valores finitos; si quieres filtrar únicamente los NaN y conservar los infinitos, usa la máscara invertida de np.isnan() explicada arriba. Consulta la documentación oficial de np.isfinite() para conocer su comportamiento con tipos numéricos.
Eliminar valores NaN con math.isnan()
La función math.isnan() de la biblioteca estándar de Python comprueba un valor escalar cada vez. Primero, impórtala con import math. Para un array numérico unidimensional, una comprensión de listas puede crear una máscara booleana: keep = [not math.isnan(value) for value in values]; después, úsala como índice: filtered = values[keep]. Este método recorre cada elemento del array en Python, mientras que las funciones de NumPy operan sobre el array. Está pensado para una entrada unidimensional: al recorrer un array multidimensional se obtienen subarrays, no números escalares.
Eliminar valores NaN con pandas.isnull()
Si pandas ya forma parte de tu proyecto, impórtalo con import pandas as pd; pd.isnull() identifica los valores ausentes y permite crear la máscara invertida: filtered = values[~pd.isnull(values)]. Es una función de pandas, no un método de NumPy, y así evitas instalar pandas únicamente para esta tarea. Cuando se usa con estructuras de datos compatibles, también detecta otros marcadores de valores ausentes de pandas. Consulta la referencia existente de isnull() en pandas.