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