Ответы:
Возврат,
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 году, он не был «заново изобретать [колесо]» - решение по-прежнему
или сравните число с собой. 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
С питоном <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 или нет:
Ни один тип
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