Как я могу проверить значения NaN? - PullRequest
744 голосов
/ 03 июня 2009

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

Ответы [ 15 ]

967 голосов
/ 03 июня 2009

math.isnan ()

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

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

>>> import math
>>> x=float('nan')
>>> math.isnan(x)
True
>>> 
286 голосов
/ 03 июня 2009

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

def isNaN(num):
    return num != num
113 голосов
/ 03 июня 2009

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

24 голосов
/ 25 сентября 2012

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

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

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

23 голосов
/ 24 мая 2017

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

  • питон неуникальный NaN: float('nan')
  • numpy уникальный 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
20 голосов
/ 03 июня 2009

math.isnan ()

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

17 голосов
/ 26 января 2010

Другой метод, если вы застряли на <2.6, у вас нет numpy, и у вас нет поддержки IEEE 754: </p>

def isNaN(x):
    return str(x) == str(1e400*0)
10 голосов
/ 05 июля 2012

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

math.isnan()

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

a = "hello"
math.isnan(a)

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

def is_nan(x):
    return isinstance(x, float) and math.isnan(x)
8 голосов
/ 03 марта 2019

Вот три способа проверить, является ли переменная «NaN» или нет.

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
8 голосов
/ 17 июня 2010

С питоном <2,6 я закончил с </p>

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...