Python: Cómo Detectar y Manejar Valores NaN de Forma Correcta

1. Cómo identificar NaN en Python

¿Qué es NaN?

NaN (Not a Number) es un valor especial de punto flotante que indica que una operación numérica es inválida o indefinida. Generalmente aparece como resultado de divisiones por cero u operaciones no válidas, por lo que requiere especial atención en el análisis de datos y el procesamiento numérico. Si no se maneja correctamente, NaN puede provocar resultados inexactos o un funcionamiento inesperado del programa.

Importancia de detectar NaN

Cuando un conjunto de datos contiene valores NaN, la fiabilidad de los datos y los resultados de los cálculos pueden verse afectados. Por ello, es fundamental detectar primero los NaN y después aplicar un tratamiento adecuado (eliminarlos, reemplazarlos, etc.).

2. Cómo generar NaN

En Python, NaN se puede generar con float('nan'). Se utiliza para representar de forma explícita un resultado inválido en cálculos numéricos.
num = float('nan')
print(num)  # Resultado: nan

Diferencia con None

NaN indica que un valor numérico no es válido, mientras que None representa la ausencia de un valor. None puede compararse con ==, pero NaN no es igual ni siquiera a sí mismo, por lo que el uso de == no es adecuado.
num = float('nan')
print(num == num)  # Resultado: False

none_value = None
print(none_value == None)  # Resultado: True
 

3. Métodos para detectar NaN

3.1. Usando la librería estándar (math.isnan())

En la librería estándar de Python, la función math.isnan() permite comprobar si un valor es NaN. Devuelve True si el valor es NaN.
import math

num = float('nan')
print(math.isnan(num))  # Resultado: True

3.2. Usando NumPy (numpy.isnan())

NumPy, especializada en cálculos con arreglos y matrices, ofrece la función numpy.isnan() para identificar NaN de manera eficiente dentro de arreglos. Es muy utilizada en análisis numérico y procesamiento científico de datos.
import numpy as np

num_list = [1, 2, np.nan, 4]
print(np.isnan(num_list))  # Resultado: [False False  True False]

3.3. Usando pandas (pandas.isna())

Cuando se trabaja con dataframes, pandas proporciona isna() o isnull() para identificar valores NaN. Estas funciones resultan útiles en la limpieza de datos y el tratamiento de valores faltantes.
import pandas as pd
import numpy as np

data = pd.Series([1, 2, np.nan, 4])
print(pd.isna(data))  # Resultado: 0    False
                      #            1    False
                      #            2     True
                      #            3    False

4. Cómo eliminar o reemplazar valores NaN

4.1. Eliminar NaN de una lista

Para eliminar valores NaN dentro de una lista, se puede combinar math.isnan() con comprensión de listas.
import math

num_list = [1, 2, float('nan'), 4]
clean_list = [num for num in num_list if not math.isnan(num)]
print(clean_list)  # Resultado: [1, 2, 4]

4.2. Eliminar NaN en pandas (dropna())

Para eliminar NaN de un dataframe, se utiliza el método dropna(). Con ello, se eliminan las filas o columnas que contengan NaN.
import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [1, 2, np.nan], 'B': [4, np.nan, 6]})
clean_df = df.dropna()
print(clean_df)

4.3. Reemplazar NaN en pandas (fillna())

En lugar de eliminar NaN, también se puede reemplazarlos por un valor específico mediante el método fillna().
import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [1, 2, np.nan], 'B': [4, np.nan, 6]})
df.fillna(0, inplace=True)
print(df)
 
侍エンジニア塾

5. Cálculos que contienen NaN

Cuando un cálculo contiene NaN, el resultado también será NaN. Para obtener resultados precisos, es necesario eliminar o reemplazar NaN previamente.
import numpy as np

result = 10 + np.nan
print(result)  # Resultado: nan

Ejemplo de cálculos estadísticos con NaN

En análisis estadístico con datos que contienen NaN, si se desea ignorarlos en el cálculo, NumPy ofrece la función nanmean(), que calcula la media excluyendo los NaN.
import numpy as np

data = [1, 2, np.nan, 4]
mean = np.nanmean(data)  # Calcula la media ignorando NaN
print(mean)  # Resultado: 2.3333...

6. Puntos a tener en cuenta al detectar NaN

6.1. Comportamiento de los operadores de comparación

NaN posee la característica especial de no ser igual a ningún número, ni siquiera a sí mismo. Por eso, no se debe usar == o != para comprobar su existencia; es necesario emplear funciones específicas como isnan() o isna().
num = float('nan')
print(num == num)  # Resultado: False

6.2. Consideraciones en la limpieza de datos

En análisis de datos, dejar NaN sin tratar impide obtener resultados exactos y puede distorsionar los cálculos. Para garantizar la fiabilidad de los datos, es esencial eliminar o reemplazar NaN antes de realizar operaciones.

7. Conclusión

En Python, se puede detectar y manejar NaN de forma eficiente usando math, numpy y pandas. Comprender cómo tratar correctamente estos valores es un conocimiento fundamental para mantener la fiabilidad en el análisis de datos y cálculos numéricos, y resulta útil en cualquier ámbito de la programación.
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール