Как я могу проверить значения NaN?

float('nan') результаты в Nan (не число). Но как это проверить? Должно быть очень легко, но я не могу найти его.

13 ответов


математика.isnan()

проверяет, является ли float x NaN (не число). NaNs являются частью стандартов IEEE 754. Операция, подобная inf * 0, inf / inf или любой операции с участием NaN, например nan * 1, возвращает NaN.

новое в версии 2.6.

>>> import math
>>> x=float('nan')
>>> math.isnan(x)
True
>>> 

обычный способ проверить NaN-это посмотреть, равен ли он себе:

def isNaN(num):
    return num != num

numpy.isnan(number) говорит вам, если это NaN или нет в Python 2.5.


Я на самом деле просто столкнулся с этим, но для меня это была проверка на nan, -inf или inf. Я просто использовал

if float('-inf') < float(num) < float('inf'):

Это верно для чисел, ложно для nan и обоих inf, и вызовет исключение для таких вещей, как строки или другие типы (что, вероятно, хорошо). Также это не требует импорта каких-либо библиотек, таких как math или numpy (numpy настолько чертовски большой, что удваивает размер любого скомпилированного приложения).


математика.isnan()

или сравните число с самим собой. Нэн всегда != NaN, в противном случае (например, если это is число) сравнение должно быть успешным.


другой метод если вы застряли на

def isNaN(x):
    return str(x) == str(1e400*0)

вот ответ, работающий с:

  • python неуникальный Нэн: float('nan')
  • включает в себя уникальный Нэн (синглтон) : np.nan
  • любые другие объекты: строка или что-то еще (не вызывает исключений, если встречается)

вот это:

import numpy as np

def is_nan(x):
    return (x is np.nan or x != x)

и некоторые примеры:

values = [float('nan'), np.nan, 55, "string", lambda x : x]
for value in values:
    print "{:<8} : {}".format(repr(value), is_nan(value))

выход:

nan      : True
nan      : True
55       : False
'string' : False
<function <lambda> at 0x000000000927BF28> : False

С python

def isNaN(x):
    return str(float(x)).lower() == 'nan'

это работает для меня с python 2.5.1 на коробке Solaris 5.9 и с python 2.6.5 на Ubuntu 10


Ну, я вошел в этот пост, потому что у меня были некоторые проблемы с функцией:

math.isnan()

при запуске этого кода возникают проблемы:

a = "hello"
math.isnan(a)

это вызывает исключение. Мое решение для этого-сделать еще одну проверку:

def is_nan(x):
    return isinstance(x, float) and math.isnan(x)

все методы, чтобы сказать, является ли переменная 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

я получаю данные от веб-службы, которая отправляет 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

для nan типа float

>>> 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

для строк в panda take 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