Câu trả lời:
Trả về
True
nếu x là NaN (không phải số) vàFalse
ngược lại.
>>> import math
>>> x = float('nan')
>>> math.isnan(x)
True
math.isnan
ưa thích hơn np.isnan()
?
import numpy
mất khoảng 15 MB RAM, trong khi import math
mất khoảng 0,2 MB
numpy.isnan
là một lựa chọn ưu việt, vì nó xử lý các mảng NumPy. Nếu bạn không sử dụng NumPy, sẽ không có ích gì khi sử dụng phụ thuộc NumPy và dành thời gian để tải NumPy chỉ để kiểm tra NaN (nhưng nếu bạn đang viết loại mã kiểm tra NaN, có thể bạn nên sử dụng NumPy).
Cách thông thường để kiểm tra NaN là xem nó có bằng chính nó không:
def isNaN(num):
return num != num
numpy.isnan(number)
cho bạn biết nếu nó NaN
hay không.
numpy.all(numpy.isnan(data_list))
cũng hữu ích nếu bạn cần xác định xem tất cả các thành phần trong danh sách có phải là nan hay không
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)}")
Đầu ra
It's pd.isna : True
It's np.isnan : True
It's math.isnan : True
ps.isna()
giải quyết vấn đề của tôi Cảm ơn!
đây là một câu trả lời làm việc với:
float('nan')
, numpy.nan
...Một NaN được triển khai theo tiêu chuẩn, là giá trị duy nhất mà so sánh bất bình đẳng với chính nó sẽ trả về True:
def is_nan(x):
return (x != x)
Và một số ví dụ:
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)}")
Đầu ra:
nan : True
nan : True
55 : False
'string' : False
<function <lambda> at 0x000000000927BF28> : False
numpy.nan
là một float
đối tượng Python thông thường , giống như kiểu được trả về float('nan')
. Hầu hết các NaN bạn gặp trong NumPy sẽ không phải là numpy.nan
đối tượng.
numpy.nan
xác định giá trị NaN của nó ngày của riêng mình trong thư viện cơ bản trong C . Nó không quấn NaN của trăn. Nhưng hiện tại, cả hai đều tuân thủ tiêu chuẩn IEEE 754 vì họ dựa vào API C99.
float('nan') is float('nan')
(không duy nhất) và np.nan is np.nan
(duy nhất)
np.nan
là một đối tượng cụ thể, trong khi mỗi float('nan')
cuộc gọi tạo ra một đối tượng mới. Nếu bạn đã làm nan = float('nan')
, thì bạn cũng sẽ nhận được nan is nan
. Nếu bạn xây dựng một thực tế NumPy NaN với một cái gì đó giống như np.float64('nan')
, sau đó bạn sẽ nhận được np.float64('nan') is not np.float64('nan')
quá .
Tôi thực sự chỉ gặp phải vấn đề này, nhưng đối với tôi, nó đang kiểm tra nan, -inf hoặc inf. Tôi vừa mới sử dụng
if float('-inf') < float(num) < float('inf'):
Điều này đúng với các số, sai cho nan và cả inf và sẽ đưa ra một ngoại lệ cho những thứ như chuỗi hoặc các loại khác (có lẽ là một điều tốt). Ngoài ra, điều này không yêu cầu nhập bất kỳ thư viện nào như math hay numpy (numpy quá lớn đến nỗi nó tăng gấp đôi kích thước của bất kỳ ứng dụng được biên dịch nào).
math.isfinite
đã không được giới thiệu cho đến khi Python 3.2, vì vậy đã đưa ra câu trả lời từ @DaveTheSellectist đã được đăng vào năm 2012, nó không chính xác là "phát minh lại [bánh xe" - giải pháp vẫn là viết tắt của những người làm việc với Python 2.
hoặc so sánh số lượng với chính nó. NaN luôn luôn là! = NaN, nếu không (ví dụ nếu đó là một số) thì việc so sánh sẽ thành công.
Vâng, tôi đã đăng bài viết này, vì tôi đã gặp một số vấn đề với chức năng:
math.isnan()
Có vấn đề khi bạn chạy mã này:
a = "hello"
math.isnan(a)
Nó làm tăng ngoại lệ. Giải pháp của tôi cho điều đó là thực hiện một kiểm tra khác:
def is_nan(x):
return isinstance(x, float) and math.isnan(x)
def is_nan(x): try: return math.isnan(x) except: return False
Tôi đang nhận dữ liệu từ một dịch vụ web gửi NaN
dưới dạng chuỗi 'Nan'
. Nhưng cũng có thể có các loại chuỗi khác trong dữ liệu của tôi, vì vậy một đơn giản float(value)
có thể đưa ra một ngoại lệ. Tôi đã sử dụng biến thể sau đây của câu trả lời được chấp nhận:
def isnan(value):
try:
import math
return math.isnan(float(value))
except:
return False
Yêu cầu:
isnan('hello') == False
isnan('NaN') == True
isnan(100) == False
isnan(float('nan')) = True
try: int(value)
value
việc có NaN
hay không?
NaN
nó (như trong python những gì bạn có thể nhận được float('inf') * 0
), và do đó, mặc dù chuỗi 'Xin chào' không phải là một số, nhưng nó cũng không phải NaN
vì NaN
vẫn là một giá trị số!
int(value)
Đối với tất cả ngoại lệ, False
sẽ được viết.
Tất cả các phương thức để biết biến đó là NaN hay Không:
Không có loại
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()
Loại 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
Nếu bạn có các loại hỗn hợp trong một lần lặp, đây là một giải pháp không sử dụng 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]
Đánh giá ngắn mạch có nghĩa là isnan
sẽ không được gọi trên các giá trị không thuộc loại 'float', vì False and (…)
nhanh chóng đánh giá False
mà không phải đánh giá phía bên tay phải.
Trong Python 3.6 kiểm tra giá trị chuỗi x math.isnan (x) và np.isnan (x) phát sinh lỗi. Vì vậy, tôi không thể kiểm tra xem giá trị đã cho có phải là NaN hay không nếu tôi không biết trước đó là số. Sau đây dường như để giải quyết vấn đề này
if str(x)=='nan' and type(x)!='str':
print ('NaN')
else:
print ('non NaN')
Có vẻ như kiểm tra nếu nó bằng chính nó
x!=x
là nhanh nhất
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)
cho chuỗi trong gấu trúc lấy pd.isnull:
if not pd.isnull(atext):
for word in nltk.word_tokenize(atext):
chức năng trích xuất tính năng cho 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