Numpy isnan () bir kayan nokta dizisinde başarısız oluyor (pandas veri çerçevesinden geçerli)


106

Pandas veri çerçevesindeki bir uygulamadan çıkan bir dizi kayan nokta (bazı normal sayılar, bazı nans) var.

Bazı nedenlerden ötürü, numpy.isnan bu dizide başarısız oluyor, ancak aşağıda gösterildiği gibi, her eleman bir float, numpy.isnan her eleman üzerinde doğru çalışıyor, değişkenin türü kesinlikle bir numpy dizidir.

Neler oluyor?!

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

Yanıtlar:


167

np.isnan yerel dtype (np.float64 gibi) NumPy dizilerine uygulanabilir:

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

ancak nesne dizilerine uygulandığında TypeError'ı yükseltir:

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

Pandalarınız olduğundan, pd.isnullbunun yerine kullanabilirsiniz - Nesne veya yerel dtype'lerin NumPy dizilerini kabul edebilir:

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)

Bunun Nonenesne dizilerinde de boş bir değer olarak kabul edildiğini unutmayın .


3
Teşekkürler - pd.isnull () kullanıldı. Herhangi bir performans etkisi gibi görünmüyor.
tim654321

12

Np.isnan () ve pd.isnull () için harika bir yedek

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

çünkü sadece nan kendisine eşit değildir.


bu diziler için çalışmayabilir çünkü iyi bilinen "ValueError: Bir xxx'in gerçek değeri belirsizdir".
MSeifert

@MSeifert sen mi bahsediyorsun piton ? Bu yöntemi sadece makine öğreniminde bir şeyler yapmak için kullanıyorum, Neden iyi bilinen hatayla karşılaşmadım?
Statham

Evet, daha önce hissiz ya da panda kullanmamışsınız gibi görünüyor. Sadece import numpy as np; a = np.array([1,2,3, np.nan])kodunuzu kullanın ve çalıştırın.
MSeifert

@MSeifert er, uyuşuklukta yeniyim ama kod iyi çalıştı, hata olmadı
Statham

[1] 'de: np olarak içe aktarım [2]' de: a = np.array ([1,2,3, np.nan]) [3] 'te: [1. 2. 3. nan] In [ 4]: bir [3] == a [3] yazdırın
Statham

10

@Unutbu cevabının yanı sıra, pandaların numpy nesne dizisini yerel (float64) tipe, satır boyunca bir şeye zorlayabilirsiniz.

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

Sayısal bir değere ayrıştırılamayan dizeleri NaN olmaya zorlamak için error = 'coerce' belirtin. Sütun türü olur dtype: float64ve ardından isnankontrol çalışmalıdır


Onun adı görünüyor unutbu;)
Dr_Zaszuś

@ Dr_Zaszuś Teşekkürler, düzeltildi
Severin Pappadeux

1

Pandaları kullanarak csv dosyasını içe aktardığınızdan emin olun

import pandas as pd

condition = pd.isnull(data[i][j])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.