Jawaban:
Kembali
True
jika x adalah NaN (bukan angka), danFalse
sebaliknya.
>>> import math
>>> x = float('nan')
>>> math.isnan(x)
True
math.isnan
lebih suka np.isnan()
?
import numpy
membutuhkan sekitar 15 MB RAM, sedangkan import math
membutuhkan sekitar 0,2 MB
numpy.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:
def isNaN(num):
return num != num
numpy.isnan(number)
memberi tahu Anda apakah itu NaN
atau tidak.
numpy.all(numpy.isnan(data_list))
juga berguna jika Anda perlu menentukan apakah semua elemen dalam daftar adalah nan
all(map(math.isnan, [float("nan")]*5))
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)}")
Keluaran
It's pd.isna : True
It's np.isnan : True
It's math.isnan : True
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:
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 : True
55 : False
'string' : False
<function <lambda> at 0x000000000927BF28> : False
numpy.nan
adalah float
objek Python biasa , sama seperti jenis yang dikembalikan oleh float('nan')
. Sebagian besar NaN yang Anda temui di NumPy tidak akan menjadi numpy.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) dan np.nan is np.nan
(unik)
np.nan
adalah objek tertentu, sementara setiap float('nan')
panggilan menghasilkan objek baru. Jika Anda melakukannya nan = float('nan')
, maka Anda akan mendapatkannya nan is nan
juga. 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 .
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.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.
atau bandingkan nomor itu dengan dirinya sendiri. NaN selalu! = NaN, jika tidak (misalnya jika adalah nomor) perbandingan harus berhasil.
Yah saya masuk posting ini, karena saya punya beberapa masalah dengan fungsi:
math.isnan()
Ada masalah saat Anda menjalankan kode ini:
a = "hello"
math.isnan(a)
Itu menimbulkan pengecualian. Solusi saya untuk itu adalah melakukan pemeriksaan lagi:
def is_nan(x):
return isinstance(x, float) and math.isnan(x)
def is_nan(x): try: return math.isnan(x) except: return False
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
-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 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:
return False
Kebutuhan:
isnan('hello') == False
isnan('NaN') == True
isnan(100) == False
isnan(float('nan')) = True
try: int(value)
value
menjadi NaN
atau tidak?
NaN
(seperti dalam python apa yang bisa Anda dapatkan float('inf') * 0
), dan meskipun string 'Halo' bukan angka, tetapi juga bukan NaN
karena NaN
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
In [1]: from numpy import math
In [2]: a = None
In [3]: not a
Out[3]: True
In [4]: len(a or ()) == 0
Out[4]: True
In [5]: a == None
Out[5]: True
In [6]: a is None
Out[6]: True
In [7]: a != a
Out[7]: False
In [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) == 0
Traceback (most recent call last):
File "<ipython-input-10-65b72372873e>", line 1, in <module>
len(a) == 0
TypeError: 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]: False
In [14]: b != b
Out[14]: True
In [15]: math.isnan(b)
Out[15]: True
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 if not (
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 isnan
tidak akan dipanggil pada nilai-nilai yang bukan dari tipe 'float', karena False and (…)
cepat dievaluasi False
tanpa 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')
Tampaknya memeriksa apakah itu sama dengan dirinya sendiri
x!=x
adalah yang tercepat.
import pandas as pd
import numpy as np
import math
x = float('nan')
%timeit x!=x
44.8 ns ± 0.152 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
%timeit math.isnan(x)
94.2 ns ± 0.955 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
%timeit pd.isna(x)
281 ns ± 5.48 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit np.isnan(x)
1.38 µs ± 15.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
untuk string di panda take pd.isnull:
if not pd.isnull(atext):
for word in nltk.word_tokenize(atext):
fungsi sebagai ekstraksi fitur untuk NLTK
def act_features(atext):
features = {}
if not pd.isnull(atext):
for word in nltk.word_tokenize(atext):
if word not in default_stopwords:
features['cont({})'.format(word.lower())]=True
return features