Відповіді:
Повертається,
True
якщо x - NaN (не число) таFalse
інше.
>>> import math
>>> x = float('nan')
>>> math.isnan(x)
True
math.isnan
кращим , щоб np.isnan()
?
import numpy
займає близько 15 Мб оперативної пам’яті, тоді як import math
займає близько 0,2 Мб
numpy.isnan
це чудовий вибір, оскільки він обробляє масиви NumPy. Якщо ви не використовуєте NumPy, немає користі брати залежність від NumPy і витрачати час на завантаження NumPy лише для перевірки NaN (але якщо ви пишете тип коду, який робить перевірку NaN, швидше за все, ви повинні використовувати NumPy).
Звичайний спосіб перевірити наявність NaN - це перевірити, чи рівний він самому собі:
def isNaN(num):
return num != num
numpy.isnan(number)
повідомляє вам, NaN
чи ні.
numpy.all(numpy.isnan(data_list))
також корисно, якщо вам потрібно визначити, чи всі елементи у списку нан
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)}")
Вихідні дані
It's pd.isna : True
It's np.isnan : True
It's math.isnan : True
ps.isna()
вирішує мої питання. Дякую!
ось відповідь, що працює з:
float('nan')
, numpy.nan
...NaN, реалізований за стандартом, є єдиним значенням, для якого порівняння нерівності з самим собою повинно повернути True:
def is_nan(x):
return (x != x)
І кілька прикладів:
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)}")
Вихід:
nan : True
nan : True
55 : False
'string' : False
<function <lambda> at 0x000000000927BF28> : False
numpy.nan
є звичайним float
об’єктом Python , як і вид, який повертається float('nan')
. Більшість NaN, з якими ви стикаєтесь у NumPy, не будуть numpy.nan
об'єктом.
numpy.nan
визначає його значення NaN по собі в базовій бібліотеці C . Він не загортає NaN пітона. Але тепер вони обидва відповідають стандарту IEEE 754, оскільки вони покладаються на C99 API.
float('nan') is float('nan')
(неповторно) та np.nan is np.nan
(унікально)
np.nan
є конкретним об'єктом, тоді як кожен float('nan')
виклик створює новий об'єкт. Якби ти це зробив nan = float('nan')
, то ти теж отримав би nan is nan
. Якщо ви побудували фактичний NumPy NaN що - щось на зразок np.float64('nan')
, то ви отримаєте np.float64('nan') is not np.float64('nan')
занадто .
Я насправді просто натрапив на це, але для мене це перевірка на nan, -inf чи inf. Я просто використовував
if float('-inf') < float(num) < float('inf'):
Це справедливо для чисел, false для nan і обох inf, і створить виняток для таких речей, як рядки або інші типи (що, мабуть, добре). Крім того, для цього не потрібно імпортувати будь-які бібліотеки, такі як математика або numpy (numpy настільки чортово великий, що подвоює розмір будь-якої складеної програми).
math.isfinite
не був представлений до Python 3.2, тому, зважаючи на відповідь @DaveTheScientist, було розміщено в 2012 році, це було не точно "винаходити колесо" - рішення все ще стосується тих, хто працює з Python 2.
або порівняти число до себе. NaN завжди! = NaN, інакше (наприклад, якщо це так) це число) порівняння має досягти успіху.
Добре я зайшов у цю посаду, тому що у мене виникли деякі проблеми з функцією:
math.isnan()
Під час запуску цього коду є проблеми:
a = "hello"
math.isnan(a)
Це породжує виняток. Моє рішення для цього - зробити ще одну перевірку:
def is_nan(x):
return isinstance(x, float) and math.isnan(x)
def is_nan(x): try: return math.isnan(x) except: return False
З python <2.6 я закінчив
def isNaN(x):
return str(float(x)).lower() == 'nan'
Це працює для мене з python 2.5.1 на вікні Solaris 5.9 та з python 2.6.5 на Ubuntu 10
-1.#IND
Я отримую дані від веб-сервісу, який надсилає NaN
як рядок 'Nan'
. Але в моїх даних можуть бути й інші види рядків, тому простий float(value)
може викинути виняток. Я використав наступний варіант прийнятої відповіді:
def isnan(value):
try:
import math
return math.isnan(float(value))
except:
return False
Вимога:
isnan('hello') == False
isnan('NaN') == True
isnan(100) == False
isnan(float('nan')) = True
try: int(value)
value
те, NaN
чи ні?
NaN
(як, наприклад, у python, що ви могли б отримати float('inf') * 0
), і, хоча рядок "Hello" - це не число, але це також не NaN
тому NaN
, що все ще є числовим значенням!
int(value)
За всіх винятків False
буде написано.
Усі методи визначити, чи є змінна NaN чи None:
Немає типу
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()
Тип 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
Якщо ви маєте змішані типи в ітерабелі, ось рішення, яке не використовує 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]
Оцінка короткого замикання означає, що isnan
не буде викликано значення, що не мають типу "float", як False and (…)
швидко оцінюється до False
без необхідності оцінювати праву частину.
У Python 3.6 перевірка значень рядка x math.isnan (x) та np.isnan (x) викликає помилку. Тому я не можу перевірити, чи задане значення NaN чи ні, якщо я заздалегідь не знаю, це число. Наступне, здається, вирішує це питання
if str(x)=='nan' and type(x)!='str':
print ('NaN')
else:
print ('non NaN')
Здається, перевірити, чи рівна вона сама собі
x!=x
найшвидший.
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)
для рядків у панді прийняти pd.isnull:
if not pd.isnull(atext):
for word in nltk.word_tokenize(atext):
функція як вилучення функції для 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