web-dev-qa-db-fra.com

Numpy isnan () échoue sur un tableau de floats (de pandas dataframe apply)

J'ai un tableau de flottants (des nombres normaux, des nans) qui sort d'une application sur un pandas dataframe.

Pour une raison quelconque, numpy.isnan échoue sur ce tableau. Toutefois, comme indiqué ci-dessous, chaque élément est un nombre flottant. Numpy.isnan s'exécute correctement sur chaque élément. Le type de la variable est certainement un tableau numpy.

Que se passe-t-il?!

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
70
tim654321

_np.isnan_ peut être appliqué aux tableaux NumPy de types natifs (tels que np.float64):

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

mais déclenche TypeError lorsqu'il est appliqué à des tableaux d'objets:

_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''
_

Depuis que vous avez des pandas, vous pouvez utiliser pd.isnull à la place - il peut accepter les tableaux NumPy d'objets ou de types natifs:

_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)
_

Notez que None est également considérée comme une valeur nulle dans les tableaux d'objets.

103
unutbu

En plus de la réponse @unubtu, vous pouvez contraindre pandas tableau d'objet numpy au type natif (float64), quelque chose le long de la ligne

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

Spécifiez errors = 'contraint' pour forcer les chaînes qui ne peuvent pas être analysées avec une valeur numérique à devenir NaN. Le type de colonne serait dtype: float64, puis isnan check devrait fonctionner

7
Severin Pappadeux

Un excellent substitut pour np.isnan () et pd.isnull () est

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

puisque seulement nan n'est pas égal à lui-même.

5
Statham