Nan'ı Python / NumPy listesinden nasıl kaldırabilirim


96

Değerleri sayan bir listem var, aldığım değerlerden biri 'nan'

countries= [nan, 'USA', 'UK', 'France']

Kaldırmaya çalıştım ama her seferinde bir hata alıyorum

cleanedList = [x for x in countries if (math.isnan(x) == True)]
TypeError: a float is required

Bunu denediğimde:

cleanedList = cities[np.logical_not(np.isnan(countries))]
cleanedList = cities[~np.isnan(countries)]

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

4
Bu "nan", gerçek bir NaN değerine değil , dizeye benziyor .
BrenBarn

1
evet, bu bir dizedir. [ülkelerdeki x x x = 'nan' eğer!]
MarshalSHI

4
if condition == Truegereksiz, her zaman yapabilirsin if condition.
Reem

Şimdiye kadar sağlanan hiçbir çözüm tatmin edici değil. Bende de aynı sorun var. Temel olarak dizeler için çalışmaz. Bu nedenle sizin durumunuzda np.isnan('USA')aynı hata mesajını gönderecektir. Bir çözüm bulursam onu ​​yüklerim.
Yohan Obadia

Yanıtlar:


131

Soru değişti, bu yüzden cevabı var:

math.isnanBir float argümanı beklediği için dizeler kullanılarak test edilemez . Senin içindecountries kayan sayılar ve dizeler var.

Sizin durumunuzda aşağıdakiler yeterli olmalıdır:

cleanedList = [x for x in countries if str(x) != 'nan']

Eski cevap

Senin içinde countrieslistede, hazır bilgi 'nan'bir dize değil Python şamandıra olduğu naneşdeğerdir:

float('NaN')

Sizin durumunuzda aşağıdakiler yeterli olmalıdır:

cleanedList = [x for x in countries if x != 'nan']

1
Mantıksal olarak, söyledikleriniz doğrudur. Ama benim için yürümedi.
user3001937

O zaman sorun başka bir alandadır, verdiğiniz dizi math.isnan, hatalarla doğal olacak dizelerdir .

Evet ! çıktıyı yazdırdığımda şunu elde ettim: [nan, 'USA', 'UK', 'France']
user3001937

1
@ user3001937 Cevabı yeni bilgilere dayanarak güncelledim

2
zhangxaochen: bu bir dizge değil, bir şamandıra. Güncellenen yanıta dikkatlice bakın; Lego Stormtroopr x, karşılaştırabilmeniz için bir dizgeye dönüşüyor . nanile ==karşılaştırıldığında bile her zaman için yanlış döndürür nan, bu yüzden karşılaştırmanın en kolay yolu budur.
Ücretsiz Monica Cellio

17

Sorun, np.isnan()dize değerlerini doğru şekilde işlememesinden kaynaklanmaktadır. Örneğin, yaparsanız:

np.isnan("A")
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''

Bununla birlikte, pandalar sürümü pd.isnull()sayısal ve dize değerleri için çalışır:

pd.isnull("A")
> False

pd.isnull(3)
> False

pd.isnull(np.nan)
> True

pd.isnull(None)
> True

15

Örneğinizi kullanarak ...

countries= [nan, 'USA', 'UK', 'France']

Nan, nan (nan! = Nan) ve ülkeler [0] = nan olmadığından, aşağıdakileri gözlemlemelisiniz:

countries[0] == countries[0]
False

Ancak,

countries[1] == countries[1]
True
countries[2] == countries[2]
True
countries[3] == countries[3]
True

Bu nedenle, aşağıdakiler çalışmalıdır:

cleanedList = [x for x in countries if x == x]

1
Bu, dizeler listesinde bir float ('nan') olduğunda işe yarayan tek cevaptır
kmundnic

13
import numpy as np

mylist = [3, 4, 5, np.nan]
l = [x for x in mylist if ~np.isnan(x)]

Bu, tüm NaN'yi kaldırmalıdır. Tabii ki, burada bir dizge değil, gerçek NaN ( np.nan) olduğunu varsayıyorum .


1
Bu bana hata veriyor: TypeError: ufunc 'isnan' giriş türleri için desteklenmiyor ve girdiler, '' güvenli '' döküm kuralına göre desteklenen herhangi bir türe güvenli bir şekilde zorlanamadı
Zak Keirn

1
Neden sadece: x[~ np.isnan(x)]? Numpy'de liste anlamasına gerek yok. Tabii ki, x'in uyuşuk bir dizi olduğunu varsayıyorum.
bue

Sorunun önerdiği gibi x'in uyuşuk bir dizi olmayacağını varsaydım.
Ajay Shah

Yüzer. Dizeleri olan listelerde çalışmayacak @ZakKeirn
Shirish Bajpai

7

Eksik değerleri şöyle bir listeden kaldırmayı seviyorum:

list_no_nan = [x for x in list_with_nan if pd.notnull(x)]

6

eleman türünü kontrol ederseniz

type(countries[1])

sonuç <class float> , aşağıdaki kodu kullanabilmeniz için olacaktır :

[i for i in countries if type(i) is not float]

5

numpy fantezi indeksleme kullanın :

In [29]: countries=np.asarray(countries)

In [30]: countries[countries!='nan']
Out[30]: 
array(['USA', 'UK', 'France'], 
      dtype='|S6')

2

Bunu yapmanın başka bir yolu da şu şekilde filtre kullanmayı içerir :

countries = list(filter(lambda x: str(x) != 'nan', countries))

1

Örneğinizde 'nan'bir dize olduğu için isnan()sadece dizeyi kontrol etmek yerine

bunun gibi:

cleanedList = [x for x in countries if x != 'nan']

-1

Örneğin Pandaların boş değerler için 'nan' döndüreceğini fark ettim. Bir dizge olmadığı için onu eşleştirmek için bir dizgiye dönüştürmeniz gerekir. Örneğin:

ulist = df.column1.unique() #create a list from a column with Pandas which 
for loc in ulist:
    loc = str(loc)   #here 'nan' is converted to a string to compare with if
    if loc != 'nan':
        print(loc)
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.