Numpy isnan () falla en una matriz de flotadores (de pandas se aplica el marco de datos)

100

Tengo una matriz de flotadores (algunos números normales, algunos nans) que salen de una aplicación en un marco de datos de pandas.

Por alguna razón, numpy.isnan está fallando en esta matriz, sin embargo, como se muestra a continuación, cada elemento es un flotante, numpy.isnan se ejecuta correctamente en cada elemento, el tipo de variable es definitivamente una matriz numpy.

¡¿Que esta pasando?!

set([type(x) for x in tester])
Out[59]: {float}

tester
Out[60]: 
array([-0.7000000000000001, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan], dtype=object)

set([type(x) for x in tester])
Out[61]: {float}

np.isnan(tester)
Traceback (most recent call last):

File "<ipython-input-62-e3638605b43c>", line 1, in <module>
np.isnan(tester)

TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

set([np.isnan(x) for x in tester])
Out[65]: {False, True}

type(tester)
Out[66]: numpy.ndarray
tim654321
fuente

Respuestas:

162

np.isnan se puede aplicar a matrices NumPy de dtype nativo (como np.float64):

In [99]: np.isnan(np.array([np.nan, 0], dtype=np.float64))
Out[99]: array([ True, False], dtype=bool)

pero genera TypeError cuando se aplica a matrices de objetos:

In [96]: np.isnan(np.array([np.nan, 0], dtype=object))
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

Como tiene Pandas, puede usarlo pd.isnullen su lugar; puede aceptar matrices NumPy de objetos o tipos nativos:

In [97]: pd.isnull(np.array([np.nan, 0], dtype=float))
Out[97]: array([ True, False], dtype=bool)

In [98]: pd.isnull(np.array([np.nan, 0], dtype=object))
Out[98]: array([ True, False], dtype=bool)

Tenga en cuenta que Nonetambién se considera un valor nulo en las matrices de objetos.

unutbu
fuente
3
Gracias - usé pd.isnull (). Tampoco parece haber ningún impacto en el rendimiento.
tim654321
11

Un gran sustituto de np.isnan () y pd.isnull () es

for i in range(0,a.shape[0]):
    if(a[i]!=a[i]):
       //do something here
       //a[i] is nan

ya que solo nan no es igual a sí mismo.

Statham
fuente
eso puede no funcionar para matrices porque genera el conocido "ValueError: El valor de verdad de un xxx es ambiguo".
MSeifert
@MSeifert ¿Estás hablando de Python ? Solo uso este método para hacer algo en el aprendizaje automático, ¿por qué no encontré el error conocido?
Statham
Sí, parece que no has usado numpy o pandas antes. Solo usa import numpy as np; a = np.array([1,2,3, np.nan])y ejecuta tu código.
MSeifert
@MSeifert er, soy nuevo en numpy pero el código funcionó bien, no ocurrió ningún error
Statham
En [1]: importar numpy as np En [2]: a = np.array ([1,2,3, np.nan]) En [3]: imprimir a [1. 2. 3. nan] En [ 4]: imprime a [3] == a [3] False
Statham
10

Además de la respuesta de @unutbu, puede coaccionar la matriz de objetos numpy de pandas al tipo nativo (float64), algo en la línea

import pandas as pd
pd.to_numeric(df['tester'], errors='coerce')

Especifique errors = 'coerce' para forzar cadenas que no se pueden analizar a un valor numérico para convertirse en NaN. El tipo de columna sería dtype: float64, y luego la isnanverificación debería funcionar

Severin Pappadeux
fuente
Su nombre parece ser unutbu;)
Dr_Zaszuś
@ Dr_Zaszuś Gracias, arreglado
Severin Pappadeux
0

Asegúrese de importar el archivo csv usando Pandas

import pandas as pd

condition = pd.isnull(data[i][j])
Dariswan Janweri P.
fuente