NaN 값을 확인하려면 어떻게해야합니까?


답변:


1275

math.isnan (x)

반환 Truex는 NaN (숫자), 및 경우 False그렇지.

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

5
@ charlie-parker : Python3에서 math.isnan은 여전히 ​​수학 모듈의 일부입니다. docs.python.org/3/library/math.html#math.isnan . 원한다면 numpy.isnan을 사용하십시오.이 답변은 제안 일뿐입니다.
gimel

2
@ SittingBull docs.python.org/3/library/functions.html#float "인수가 문자열이면 10 진수를 포함해야합니다"또는 "Infinity" "inf" "nan"
gimel

35
되는 math.isnan선호 np.isnan()?
TMWP

34
@TMWP 가능성이 ... import numpy반면, RAM의 약 15 MB 소요 import math일부 0.2 MB 소요
petrpulc

9
@TMWP : NumPy를 사용하는 경우 numpy.isnanNumPy 배열을 처리하므로 탁월한 선택입니다. NumPy를 사용하지 않는 경우 NumPy 종속성을 가져 와서 NaN 검사를 위해 NumPy를로드하는 데 시간을 소비하는 이점은 없습니다 (그러나 NaN 검사를 수행하는 코드 종류를 작성하는 경우 사용해야 합니다) NumPy).
user2357112는 Monica

359

NaN을 테스트하는 일반적인 방법은 그것이 자신과 같은지 확인하는 것입니다.

def isNaN(num):
    return num != num

8
경고의 말씀 : 아래에 Bear의 의견을 인용하십시오. "Python <= 2.5. 그렇게 말하면서, 나는 그것이 실제로 실패한 것을 본 적이 없다.
mavnn

22
연산자 오버로드가 주어지면이 기능을 혼동 할 수있는 많은 방법이 있다고 확신합니다. math.isnan ()으로 이동
djsadinoff

4
위에서 언급 한 754 스펙에서 NaN == NaN은 항상 구현되지는 않지만 항상 거짓이어야한다고 말합니다. 어쨌든 수학 및 / 또는 숫자가 어떻게 후드 아래에서 이것을 확인하는 것이 가능하지 않습니까?
Hari Ganesan

감사 . 스칼라에서 작업을 수행하는 경우 np.isnan을 사용하는 것보다 15-20 배 빠릅니다.
thomas.mac

5
비록 이것이 효과가 있고 어느 정도 이해가 되더라도 나는 원칙을 가진 인간이며 이것을 금지 된 주술로 선언합니다. 대신 math.isnan을 사용하십시오.
Gonzalo

152

numpy.isnan(number)NaN그렇지 않은 경우 알려줍니다 .


3
파이썬 버전 2.7에서도 작동합니다.
Michel Keijzers

6
numpy.all(numpy.isnan(data_list))목록의 모든 요소가 난인지 확인해야하는 경우에도 유용합니다.
Jay P.

3
NumPy 필요 없음 :all(map(math.isnan, [float("nan")]*5))
sleblanc

6
이 답변이 6 년 전에 쓰여졌을 때 Python 2.5는 여전히 보편적으로 사용되며 math.isnan은 표준 라이브러리의 일부가 아닙니다. 요즘 나는 그것이 많은 곳에서 그렇지 않다는 것을 정말로 희망하고 있습니다!
mavnn

4
np.isnan ()은 decimal.Decimal 유형 (numpy의 함수 수만큼)을 처리하지 않습니다. math.isnan ()이 처리합니다.
comte

55

변수를 테스트 할 수있는 세 가지 방법은 "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

2
pd.isna (value)는 많은 문제를 해결했습니다! 매력처럼 작동합니다!
abhishake

1
ps.isna()내 문제를 해결합니다. 감사!
darthbhyrava

32

다음은 작업에 대한 답변입니다.

  • IEEE 754 표준을 고려한 NaN 구현
    • 즉 : 파이썬의 NaN : 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

1
내가 확인하고있는 시리즈는 누락 된 값이있는 문자열이 'nans'(???) 이므로이 솔루션은 다른 사람들이 실패한 곳에서 작동합니다.
keithpjolley 22

numpy.nan는에서 float반환 한 것과 같은 일반적인 파이썬 객체 float('nan')입니다. NumPy에서 만나는 대부분의 NaN은 numpy.nan객체 가 아닙니다 .
user2357112는

numpy.nanC의 기본 라이브러리에서 자체적 으로 NaN 값 정의합니다 . 파이썬의 NaN을 감싸지 않습니다. 그러나 현재 C99 API를 사용하므로 IEEE 754 표준을 준수합니다.
x0s

Monica : Python과 numpy NaN은 실제로 같은 방식으로 동작하지 않습니다 : float('nan') is float('nan')(비 고유) 및 np.nan is np.nan(고유)
x0s

@ x0s : NumPy와 관련이 없습니다. np.nanfloat('nan')호출은 새 객체를 생성하는 동안 특정 객체입니다. 당신이했다면, 당신도 nan = float('nan')얻을 것이다 nan is nan. 당신이 구축되면 실제 같은과 NumPy와 NaN의를 np.float64('nan'), 다음 당신은 얻을 것 np.float64('nan') is not np.float64('nan')너무 .
user2357112는

28

나는 실제로 이것에 부딪쳤다. 그러나 나를 위해 그것은 nan, -inf 또는 inf를 점검하고 있었다. 방금 사용한

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

이것은 숫자에 해당되고 nan과 inf에 대해서는 false이며 문자열 또는 다른 유형 (아마도 좋은 것)에 대한 예외가 발생합니다. 또한 이것은 math 또는 numpy와 같은 라이브러리를 가져올 필요가 없습니다 (numpy는 너무 커서 컴파일 된 응용 프로그램의 크기를 두 배로 늘립니다).


9
math.isfinite@DaveTheScientist의 답변을 2012 년에 게시 한 것은 정확히 "바퀴를 재발견"한 것이 아닙니다. 해결책은 여전히 ​​Python 2를 사용하는 사람들을 나타냅니다.
sudo_coffee

22

math.isnan ()

또는 숫자를 자체와 비교하십시오. NaN이 항상입니다! = (이 경우 예를 들어, NaN를, 그렇지 않으면 입니다 숫자) 비교 성공한다.


6
사람들은 파이썬 <= 2.5로 붙어 있습니다. Nan! = Nan은 안정적으로 작동하지 않았습니다. 대신 numpy를 사용했습니다.
Bear

16

<2.6에 갇힌 경우 다른 방법은 숫자가 없으며 IEEE 754를 지원하지 않는 것입니다.

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

11

함수에 문제가 있기 때문에 글을 올렸습니다.

math.isnan()

이 코드를 실행할 때 문제가 있습니다.

a = "hello"
math.isnan(a)

예외가 발생합니다. 그에 대한 나의 해결책은 다른 점검을하는 것입니다.

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

3
isnan ()은 문자열이 아닌 부동 소수점을 취하기 때문에 다운 보트되었을 수 있습니다. 이 기능에는 아무런 문제가 없으며 문제는 그의 기능을 사용하려고 시도한 것입니다. (그 특정 유스 케이스의 경우 그의 솔루션은 유효하지만이 질문에 대한 답은 아닙니다.)
Peter Hansen

6
이런 방식으로 유형을 확인하는 데주의하십시오. 이것은 numpy.float32 NaN의 경우에는 작동하지 않습니다. 시도 / 제외 구조를 사용하는 것이 좋습니다 : def is_nan(x): try: return math.isnan(x) except: return False
Rob

3
NaN은 값이 유효한 숫자 가 아님을 의미 하지 않습니다 . 특정 결과가 정의되지 않도록 지정하는 것은 IEEE 부동 소수점 표현의 일부입니다. "hello"가 nan인지 묻는 것은 의미가 없습니다.
Brice M. Dempsey

2
NaN이 모든 문자열, 정수 또는 부동 목록에
도달

8

파이썬 <2.6으로 나는 결국

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

이것은 Solaris 5.9 상자의 Python 2.5.1 및 Ubuntu 10의 Python 2.6.5에서 작동합니다.


6
Windows는 때때로 이것을 호출하기 때문에 이것은 이식성이 -1.#IND
Mike T

5

NaNstring으로 보내는 웹 서비스에서 데이터를 수신하고 있습니다 '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

1
또는try: int(value)
chwi

@chwi 그래서 당신의 제안은 value존재 에 대해 무엇을 말 NaN합니까?
Mahdi

글쎄, "숫자가 아님", int로 캐스팅 할 수없는 것은 실제로 숫자가 아니며 try 문은 실패할까요? false 반환을 제외하고 true를 반환하십시오.
chwi

@chwi 글쎄, 문자 그대로 "숫자가 아닌"을 취하면, 맞습니다. 그러나 그것은 요점이 아닙니다. 사실, 나는 의미론이 무엇인지 정확하게 찾고 있습니다 NaN(파이썬에서 얻을 수있는 것과 같은 것 float('inf') * 0). 따라서 문자열 'Hello'는 숫자는 아니지만 여전히 숫자 값 NaN이기 때문에 아닙니다 NaN!
Mahdi

@chwi : 예외 처리가 특정 예외에 대한 것이라면 맞습니다. 그러나이 답변에서 일반적인 예외가 처리되었습니다. 따라서 확인할 필요가 없습니다. int(value)모든 예외에 False대해 작성됩니다.
Harsha Biyani

3

변수가 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

2

혼합 데이터 유형 목록에서 NaN (float) 항목을 제거하는 방법

iterable에 혼합 유형이있는 경우 다음은 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


1

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

1

자체와 같은지 확인하는 것 같습니다.

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)

0

float 유형의 nan

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

-5

팬더의 문자열은 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

이 감소는 무엇입니까?
Max Kleiner

isnull 은 NaN 값뿐만 아니라 true를 반환합니다.
보리스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.