@ charlie-parker: Dalam Python3, math.isnan masih menjadi bagian dari modul matematika. docs.python.org/3/library/math.html#math.isnan . Gunakan numpy.isnan jika Anda mau, jawaban ini hanya saran.
@TMWP mungkin ... import numpymembutuhkan sekitar 15 MB RAM, sedangkan import mathmembutuhkan sekitar 0,2 MB
petrpulc
9
@TMWP: Jika Anda menggunakan NumPy, numpy.isnanadalah pilihan yang unggul, karena menangani array NumPy. Jika Anda tidak menggunakan NumPy, tidak ada manfaatnya untuk mengambil ketergantungan NumPy dan menghabiskan waktu untuk memuat NumPy hanya untuk cek NaN (tetapi jika Anda menulis jenis kode yang melakukan pengecekan NaN, kemungkinan Anda harus menggunakan NumPy NumPy).
user2357112 mendukung Monica
359
Cara yang biasa untuk menguji NaN adalah untuk melihat apakah itu sama dengan dirinya sendiri:
Kata peringatan: mengutip komentar Bear di bawah, "Untuk orang-orang yang terjebak dengan python <= 2.5. Nan! = Nan tidak bekerja dengan andal. Sebagai gantinya digunakan numpy." Karena itu, saya belum pernah melihatnya gagal.
mavnn
22
Saya yakin, mengingat operator kelebihan beban, ada banyak cara saya bisa membingungkan fungsi ini. pergi dengan math.isnan ()
djsadinoff
4
Dikatakan dalam spesifikasi 754 yang disebutkan di atas bahwa NaN == NaN harus selalu salah, meskipun tidak selalu diimplementasikan seperti itu. Apakah tidak mungkin ini bagaimana matematika dan / atau numpy memeriksa ini di bawah tenda?
Hari Ganesan
Terima kasih. ini juga 15-20x kali lebih cepat daripada menggunakan np.isnan jika melakukan operasi pada skalar
thomas.mac
5
Meskipun ini berhasil dan, pada tingkat tertentu masuk akal, saya adalah manusia dengan prinsip dan dengan ini saya menyatakan ini sebagai sihir yang dilarang. Silakan gunakan math.isnan sebagai gantinya.
Gonzalo
152
numpy.isnan(number)memberi tahu Anda apakah itu NaNatau tidak.
numpy.all(numpy.isnan(data_list))juga berguna jika Anda perlu menentukan apakah semua elemen dalam daftar adalah nan
Jay P.
3
Tidak perlu untuk NumPy:all(map(math.isnan, [float("nan")]*5))
sleblanc
6
Ketika jawaban ini ditulis 6 tahun yang lalu, Python 2.5 masih umum digunakan - dan math.isnan bukan bagian dari perpustakaan standar. Sekarang, saya benar-benar berharap itu tidak terjadi di banyak tempat!
mavnn
4
Perhatikan bahwa np.isnan () tidak menangani tipe desimal. Khusus (fungsi banyak numpy) math.isnan () tidak menangani.
comte
55
Berikut adalah tiga cara di mana Anda dapat menguji suatu variabel adalah "NaN" atau tidak.
import pandas as pd
import numpy as np
import math
#For single variable all three libraries return single boolean
x1 = float("nan")print(f"It's pd.isna : {pd.isna(x1)}")print(f"It's np.isnan : {np.isnan(x1)}")print(f"It's math.isnan : {math.isnan(x1)}")
pd.isna (nilai) menyelamatkan banyak masalah! bekerja seperti pesona!
abhishake
1
ps.isna()memecahkan masalah saya. Terima kasih!
darthbhyrava
32
di sini adalah jawaban yang bekerja dengan:
Implementasi NaN yang menghormati standar IEEE 754
yaitu: python ini NaN: float('nan'), numpy.nan...
objek lain: string atau apa pun (tidak menimbulkan pengecualian jika ditemui)
A NaN diimplementasikan mengikuti standar, adalah satu-satunya nilai yang perbandingan ketidaksetaraan dengan dirinya sendiri harus dikembalikan Benar:
def is_nan(x):return(x != x)
Dan beberapa contoh:
import numpy as np
values =[float('nan'), np.nan,55,"string",lambda x : x]for value in values:print(f"{repr(value):<8} : {is_nan(value)}")
Keluaran:
nan :True
nan :True55:False'string':False<function <lambda> at 0x000000000927BF28>:False
Seri yang saya periksa adalah string dengan nilai yang hilang adalah 'nans' (???) sehingga solusi ini berfungsi jika yang lain gagal.
keithpjolley
numpy.nanadalah floatobjek Python biasa , sama seperti jenis yang dikembalikan oleh float('nan'). Sebagian besar NaN yang Anda temui di NumPy tidak akan menjadi numpy.nanobjek.
user2357112 mendukung Monica
numpy.nanmendefinisikan nilai NaN nya sendiri di perpustakaan yang mendasari di C . Itu tidak membungkus NaN python. Tapi sekarang, mereka berdua mematuhi standar IEEE 754 karena mereka mengandalkan C99 API.
x0s
@ user2357112supportsMonica: Python dan NaN numpy sebenarnya tidak berperilaku dengan cara yang sama: float('nan') is float('nan')(non-unik) dan np.nan is np.nan(unik)
x0s
@ x0s: Itu tidak ada hubungannya dengan NumPy. np.nanadalah objek tertentu, sementara setiap float('nan')panggilan menghasilkan objek baru. Jika Anda melakukannya nan = float('nan'), maka Anda akan mendapatkannya nan is nanjuga. Jika Anda membuat NumPy NaN aktual dengan sesuatu seperti np.float64('nan'), maka Anda akan mendapatkannya np.float64('nan') is not np.float64('nan')juga .
user2357112 mendukung Monica
28
Saya sebenarnya hanya berlari ke ini, tetapi bagi saya itu sedang memeriksa nan, -inf, atau inf. Saya baru saja digunakan
if float('-inf')< float(num)< float('inf'):
Ini berlaku untuk angka, salah untuk nan dan keduanya inf, dan akan memunculkan pengecualian untuk hal-hal seperti string atau tipe lainnya (yang mungkin merupakan hal yang baik). Juga ini tidak mengharuskan mengimpor perpustakaan seperti matematika atau numpy (numpy sangat besar itu menggandakan ukuran aplikasi yang dikompilasi).
math.isfinitetidak diperkenalkan hingga Python 3.2, jadi diberi jawaban dari @DaveTheScientist yang diposting pada 2012 itu tidak sepenuhnya "menciptakan kembali roda" - solusi masih berlaku bagi mereka yang bekerja dengan Python 2.
Itu mungkin diturunkan karena isnan () membutuhkan pelampung, bukan string. Tidak ada yang salah dengan fungsinya, dan masalahnya hanya dalam usahanya menggunakannya. (Untuk kasus penggunaan khusus itu solusinya valid, tetapi itu bukan jawaban untuk pertanyaan ini.)
Peter Hansen
6
Hati-hati dengan memeriksa jenis dengan cara ini. Ini tidak akan berfungsi misalnya untuk NaN numpy.float32. Lebih baik menggunakan coba / kecuali konstruksi: def is_nan(x): try: return math.isnan(x) except: return False
Rob
3
NaN tidak berarti bahwa suatu nilai bukan angka yang valid. Ini adalah bagian dari representasi floating point IEEE untuk menentukan bahwa hasil tertentu tidak ditentukan. misal 0 / 0. Karena itu menanyakan apakah "halo" adalah nan tidak ada artinya.
Brice M. Dempsey
2
ini lebih baik karena NaN dapat mendarat di daftar string, int atau float, sehingga berguna check
RAFIQ
Saya harus menerapkan ini untuk menangani kolom string dalam panda.
Cristian Garcia
7
Dengan python <2.6 saya berakhir dengan
def isNaN(x):return str(float(x)).lower()=='nan'
Ini berfungsi untuk saya dengan python 2.5.1 pada kotak Solaris 5.9 dan dengan python 2.6.5 di Ubuntu 10
Ini tidak terlalu portabel, karena Windows kadang-kadang menyebutnya-1.#IND
Mike T
5
Saya menerima data dari layanan web yang mengirimkan NaNsebagai string 'Nan'. Tapi mungkin ada jenis string lain di data saya juga, jadi yang sederhana float(value)bisa melempar pengecualian. Saya menggunakan varian berikut dari jawaban yang diterima:
def isnan(value):try:import math
return math.isnan(float(value))except:returnFalse
@ Chwi jadi apa saran Anda tentang valuemenjadi NaNatau tidak?
Mahdi
Nah, menjadi "bukan angka", apa pun yang tidak bisa dicor ke int saya kira sebenarnya bukan angka, dan pernyataan coba akan gagal? Coba, kembalikan benar, kecuali kembalikan salah.
chwi
@ Chwi Nah, dengan mengambil "bukan angka" secara harfiah, Anda benar, tapi bukan itu intinya di sini. Bahkan, saya mencari persis apa semantiknya NaN(seperti dalam python apa yang bisa Anda dapatkan float('inf') * 0), dan meskipun string 'Halo' bukan angka, tetapi juga bukan NaNkarena NaNmasih merupakan nilai numerik!
Mahdi
@ chwi: Anda benar, jika penanganan pengecualian untuk pengecualian tertentu. Namun dalam jawaban ini, pengecualian umum telah ditangani. Jadi tidak perlu mencentang int(value)Untuk semua pengecualian, Falseakan ditulis.
Harsha Biyani
3
Semua metode untuk mengetahui apakah variabelnya adalah NaN atau Tidak Ada:
Tidak ada tipe
In[1]:from numpy import math
In[2]: a =NoneIn[3]:not a
Out[3]:TrueIn[4]: len(a or())==0Out[4]:TrueIn[5]: a ==NoneOut[5]:TrueIn[6]: a isNoneOut[6]:TrueIn[7]: a != a
Out[7]:FalseIn[9]: math.isnan(a)Traceback(most recent call last):File"<ipython-input-9-6d4d8c26d370>", line 1,in<module>
math.isnan(a)TypeError: a float is required
In[10]: len(a)==0Traceback(most recent call last):File"<ipython-input-10-65b72372873e>", line 1,in<module>
len(a)==0TypeError: object of type 'NoneType' has no len()
Jenis NaN
In[11]: b = float('nan')In[12]: b
Out[12]: nan
In[13]:not b
Out[13]:FalseIn[14]: b != b
Out[14]:TrueIn[15]: math.isnan(b)Out[15]:True
Cara menghapus item NaN (float) dari daftar tipe data campuran
Jika Anda memiliki tipe campuran dalam iterable, berikut adalah solusi yang tidak menggunakan numpy:
from math import isnan
Z =['a','b', float('NaN'),'d', float('1.1024')][x for x in Z ifnot(
type(x)== float # let's drop all float values…and isnan(x)# … but only if they are nan)]
['a', 'b', 'd', 1.1024]
Evaluasi hubung-pendek berarti bahwa isnantidak akan dipanggil pada nilai-nilai yang bukan dari tipe 'float', karena False and (…)cepat dievaluasi Falsetanpa harus mengevaluasi sisi kanan.
Dalam Python 3.6 memeriksa nilai string x math.isnan (x) dan np.isnan (x) memunculkan kesalahan. Jadi saya tidak dapat memeriksa apakah nilai yang diberikan NaN atau tidak jika saya tidak tahu sebelumnya itu angka. Berikut ini tampaknya mengatasi masalah ini
if str(x)=='nan'and type(x)!='str':print('NaN')else:print('non NaN')
>>>import pandas as pd
>>> value = float(nan)>>> type(value)>>><class'float'>>>> pd.isnull(value)True>>>>>> value ='nan'>>> type(value)>>><class'str'>>>> pd.isnull(value)False
ifnot pd.isnull(atext):for word in nltk.word_tokenize(atext):
fungsi sebagai ekstraksi fitur untuk NLTK
def act_features(atext):
features ={}ifnot pd.isnull(atext):for word in nltk.word_tokenize(atext):if word notin default_stopwords:
features['cont({})'.format(word.lower())]=Truereturn features
Jawaban:
math.isnan (x)
sumber
math.isnan
lebih sukanp.isnan()
?import numpy
membutuhkan sekitar 15 MB RAM, sedangkanimport math
membutuhkan sekitar 0,2 MBnumpy.isnan
adalah pilihan yang unggul, karena menangani array NumPy. Jika Anda tidak menggunakan NumPy, tidak ada manfaatnya untuk mengambil ketergantungan NumPy dan menghabiskan waktu untuk memuat NumPy hanya untuk cek NaN (tetapi jika Anda menulis jenis kode yang melakukan pengecekan NaN, kemungkinan Anda harus menggunakan NumPy NumPy).Cara yang biasa untuk menguji NaN adalah untuk melihat apakah itu sama dengan dirinya sendiri:
sumber
numpy.isnan(number)
memberi tahu Anda apakah ituNaN
atau tidak.sumber
numpy.all(numpy.isnan(data_list))
juga berguna jika Anda perlu menentukan apakah semua elemen dalam daftar adalah nanall(map(math.isnan, [float("nan")]*5))
Berikut adalah tiga cara di mana Anda dapat menguji suatu variabel adalah "NaN" atau tidak.
Keluaran
sumber
ps.isna()
memecahkan masalah saya. Terima kasih!di sini adalah jawaban yang bekerja dengan:
float('nan')
,numpy.nan
...A NaN diimplementasikan mengikuti standar, adalah satu-satunya nilai yang perbandingan ketidaksetaraan dengan dirinya sendiri harus dikembalikan Benar:
Dan beberapa contoh:
Keluaran:
sumber
numpy.nan
adalahfloat
objek Python biasa , sama seperti jenis yang dikembalikan olehfloat('nan')
. Sebagian besar NaN yang Anda temui di NumPy tidak akan menjadinumpy.nan
objek.numpy.nan
mendefinisikan nilai NaN nya sendiri di perpustakaan yang mendasari di C . Itu tidak membungkus NaN python. Tapi sekarang, mereka berdua mematuhi standar IEEE 754 karena mereka mengandalkan C99 API.float('nan') is float('nan')
(non-unik) dannp.nan is np.nan
(unik)np.nan
adalah objek tertentu, sementara setiapfloat('nan')
panggilan menghasilkan objek baru. Jika Anda melakukannyanan = float('nan')
, maka Anda akan mendapatkannyanan is nan
juga. Jika Anda membuat NumPy NaN aktual dengan sesuatu sepertinp.float64('nan')
, maka Anda akan mendapatkannyanp.float64('nan') is not np.float64('nan')
juga .Saya sebenarnya hanya berlari ke ini, tetapi bagi saya itu sedang memeriksa nan, -inf, atau inf. Saya baru saja digunakan
Ini berlaku untuk angka, salah untuk nan dan keduanya inf, dan akan memunculkan pengecualian untuk hal-hal seperti string atau tipe lainnya (yang mungkin merupakan hal yang baik). Juga ini tidak mengharuskan mengimpor perpustakaan seperti matematika atau numpy (numpy sangat besar itu menggandakan ukuran aplikasi yang dikompilasi).
sumber
math.isfinite
tidak diperkenalkan hingga Python 3.2, jadi diberi jawaban dari @DaveTheScientist yang diposting pada 2012 itu tidak sepenuhnya "menciptakan kembali roda" - solusi masih berlaku bagi mereka yang bekerja dengan Python 2.math.isnan ()
atau bandingkan nomor itu dengan dirinya sendiri. NaN selalu! = NaN, jika tidak (misalnya jika adalah nomor) perbandingan harus berhasil.
sumber
Metode lain jika Anda terjebak pada <2.6, Anda tidak memiliki numpy, dan Anda tidak memiliki dukungan IEEE 754:
sumber
Yah saya masuk posting ini, karena saya punya beberapa masalah dengan fungsi:
Ada masalah saat Anda menjalankan kode ini:
Itu menimbulkan pengecualian. Solusi saya untuk itu adalah melakukan pemeriksaan lagi:
sumber
def is_nan(x): try: return math.isnan(x) except: return False
Dengan python <2.6 saya berakhir dengan
Ini berfungsi untuk saya dengan python 2.5.1 pada kotak Solaris 5.9 dan dengan python 2.6.5 di Ubuntu 10
sumber
-1.#IND
Saya menerima data dari layanan web yang mengirimkan
NaN
sebagai string'Nan'
. Tapi mungkin ada jenis string lain di data saya juga, jadi yang sederhanafloat(value)
bisa melempar pengecualian. Saya menggunakan varian berikut dari jawaban yang diterima:Kebutuhan:
sumber
try: int(value)
value
menjadiNaN
atau tidak?NaN
(seperti dalam python apa yang bisa Anda dapatkanfloat('inf') * 0
), dan meskipun string 'Halo' bukan angka, tetapi juga bukanNaN
karenaNaN
masih merupakan nilai numerik!int(value)
Untuk semua pengecualian,False
akan ditulis.Semua metode untuk mengetahui apakah variabelnya adalah NaN atau Tidak Ada:
Tidak ada tipe
Jenis NaN
sumber
Cara menghapus item NaN (float) dari daftar tipe data campuran
Jika Anda memiliki tipe campuran dalam iterable, berikut adalah solusi yang tidak menggunakan numpy:
Evaluasi hubung-pendek berarti bahwa
isnan
tidak akan dipanggil pada nilai-nilai yang bukan dari tipe 'float', karenaFalse and (…)
cepat dievaluasiFalse
tanpa harus mengevaluasi sisi kanan.sumber
Dalam Python 3.6 memeriksa nilai string x math.isnan (x) dan np.isnan (x) memunculkan kesalahan. Jadi saya tidak dapat memeriksa apakah nilai yang diberikan NaN atau tidak jika saya tidak tahu sebelumnya itu angka. Berikut ini tampaknya mengatasi masalah ini
sumber
Tampaknya memeriksa apakah itu sama dengan dirinya sendiri
adalah yang tercepat.
sumber
sumber
untuk string di panda take pd.isnull:
fungsi sebagai ekstraksi fitur untuk NLTK
sumber