Saya memiliki daftar yang menghitung nilai, salah satu nilai yang saya dapatkan adalah 'nan'
countries= [nan, 'USA', 'UK', 'France']
Saya mencoba untuk menghapusnya, tetapi saya selalu mendapatkan kesalahan
cleanedList = [x for x in countries if (math.isnan(x) == True)]
TypeError: a float is required
Ketika saya mencoba yang ini:
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''
"nan"
, bukan nilai NaN yang sebenarnya.if condition == True
tidak perlu, Anda selalu bisa melakukannyaif condition
.np.isnan('USA')
akan mengirimkan pesan kesalahan yang sama. Jika saya menemukan solusi, saya akan mengunggahnya.Jawaban:
Pertanyaannya telah berubah, jadi memiliki jawabannya:
String tidak dapat diuji menggunakan
math.isnan
karena ini mengharapkan argumen float. Dalamcountries
daftar Anda, Anda memiliki pelampung dan string.Dalam kasus Anda, berikut ini sudah cukup:
cleanedList = [x for x in countries if str(x) != 'nan']
Jawaban lama
Dalam
countries
daftar Anda , literal'nan'
adalah string bukan float Pythonnan
yang setara dengan:float('NaN')
Dalam kasus Anda, berikut ini sudah cukup:
cleanedList = [x for x in countries if x != 'nan']
sumber
math.isnan
secara alami akan melalui kesalahan.x
menjadi string sehingga Anda dapat membandingkannya.nan
selalu mengembalikan false untuk==
, bahkan jika dibandingkan dengannan
, jadi itulah cara termudah untuk membandingkannya.Masalahnya berasal dari fakta bahwa
np.isnan()
tidak menangani nilai string dengan benar. Misalnya, jika Anda melakukan: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''
Namun versi pandas
pd.isnull()
berfungsi untuk nilai numerik dan string:pd.isnull("A") > False pd.isnull(3) > False pd.isnull(np.nan) > True pd.isnull(None) > True
sumber
Menggunakan contoh Anda di mana ...
countries= [nan, 'USA', 'UK', 'France']
Karena nan tidak sama dengan nan (nan! = Nan) dan negara [0] = nan, Anda harus memperhatikan hal berikut:
countries[0] == countries[0] False
Namun,
countries[1] == countries[1] True countries[2] == countries[2] True countries[3] == countries[3] True
Oleh karena itu, berikut ini seharusnya berhasil:
cleanedList = [x for x in countries if x == x]
sumber
import numpy as np mylist = [3, 4, 5, np.nan] l = [x for x in mylist if ~np.isnan(x)]
Ini harus menghapus semua NaN. Tentu saja, saya berasumsi bahwa ini bukan string tetapi NaN (
np.nan
) sebenarnya .sumber
x[~ np.isnan(x)]
:? Tidak ada pemahaman daftar yang diperlukan di numpy. Tentu saja, saya menganggap x adalah array numpy.Saya suka menghapus nilai yang hilang dari daftar seperti ini:
list_no_nan = [x for x in list_with_nan if pd.notnull(x)]
sumber
jika Anda memeriksa jenis elemen
type(countries[1])
hasilnya akan
<class float>
jadi kamu bisa menggunakan kode berikut:[i for i in countries if type(i) is not float]
sumber
gunakan pengindeksan mewah numpy :
In [29]: countries=np.asarray(countries) In [30]: countries[countries!='nan'] Out[30]: array(['USA', 'UK', 'France'], dtype='|S6')
sumber
Cara lain untuk melakukannya termasuk menggunakan filter seperti ini:
countries = list(filter(lambda x: str(x) != 'nan', countries))
sumber
Dalam contoh Anda
'nan'
adalah string jadi alih-alih menggunakanisnan()
hanya memeriksa stringseperti ini:
cleanedList = [x for x in countries if x != 'nan']
sumber
Saya perhatikan bahwa Panda misalnya akan mengembalikan 'nan' untuk nilai kosong. Karena ini bukan string, Anda perlu mengubahnya menjadi satu untuk mencocokkannya. Sebagai contoh:
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)
sumber