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

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.


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.


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


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])
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.