¿Comprobar de manera eficiente si el objeto arbitrario es NaN en Python / numpy / pandas?

Mis matrices numpy usan np.nan para designar valores perdidos. A medida que recorro el conjunto de datos, necesito detectar dichos valores perdidos y manejarlos de manera especial.

numpy.isnan(val) utilicé numpy.isnan(val) , que funciona bien a menos que val no esté entre el subconjunto de tipos admitidos por numpy.isnan() . Por ejemplo, los datos que faltan pueden ocurrir en campos de cadena, en cuyo caso obtengo:

 >>> np.isnan('some_string') Traceback (most recent call last): File "", line 1, in  TypeError: Not implemented for this type 

Aparte de escribir un envoltorio costoso que atrapa la excepción y devuelve False , ¿hay alguna manera de manejar esto con elegancia y eficiencia?

pandas.isnull() (también pd.isna() , en versiones más recientes) verifica los valores faltantes en las matrices numéricas y de cadena / objeto. A partir de la documentación, verifica:

NaN en matrices numéricas, Ninguno / NaN en matrices de objetos

Ejemplo rápido:

 import pandas as pd import numpy as np s = pd.Series(['apple', np.nan, 'banana']) pd.isnull(s) Out[9]: 0 False 1 True 2 False dtype: bool 

La idea de usar numpy.nan para representar valores perdidos es algo que introdujeron los pandas , por lo que los pandas tienen las herramientas para enfrentarlos.

Tiempos de fecha también (si usa pd.NaT no necesitará especificar el tipo de dty)

 In [24]: s = Series([Timestamp('20130101'),np.nan,Timestamp('20130102 9:30')],dtype='M8[ns]') In [25]: s Out[25]: 0 2013-01-01 00:00:00 1 NaT 2 2013-01-02 09:30:00 dtype: datetime64[ns]`` In [26]: pd.isnull(s) Out[26]: 0 False 1 True 2 False dtype: bool 

¿Es tu tipo realmente arbitrario? Si sabes que solo va a ser un flotante int o una cadena, podrías hacerlo

  if val.dtype == float and np.isnan(val): 

asumiendo que está envuelto en números, siempre tendrá un dtype y solo float y complex puede ser NaN