Eu tenho uma matriz de flutuadores (alguns números normais, alguns nans) que está saindo de um aplicar em um dataframe do pandas.
Por alguma razão, numpy.isnan está falhando neste array, no entanto, conforme mostrado abaixo, cada elemento é um float, numpy.isnan é executado corretamente em cada elemento, o tipo da variável é definitivamente um array numpy.
O que está acontecendo?!
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
Um ótimo substituto para np.isnan () e pd.isnull () é
já que apenas nan não é igual a si mesmo.
fonte
import numpy as np; a = np.array([1,2,3, np.nan])
e executar seu código.Além da resposta @unutbu, você poderia forçar a matriz de objetos numpy dos pandas para o tipo nativo (float64), algo ao longo da linha
Especifique errors = 'coerce' para forçar strings que não podem ser analisadas para um valor numérico se tornarem NaN. O tipo de coluna seria
dtype: float64
, e aisnan
verificação deve funcionarfonte
unutbu
;)fonte