맨땅에 헤딩하는 사람

[Python] None, NaN에 대해서 본문

파이썬/이론

[Python] None, NaN에 대해서

purplechip 2020. 5. 1. 20:37

pandas DataFrame에 None 데이터를 넣으면 NaN 객체로 자동 변환이 된다. 

from pandas import DataFrame as df
a = df([[1,2,3],[4,5,6], [None, 3,4]], columns=['a','b','c'], index=['aa','bb','cc'])

 

a를 출력하면 다음과 같다.

      a    b    c 
aa  1.0   2    3 
bb  4.0   5   6 
cc  NaN  3   4

 

그렇다면 NaN과 None의 차이는 무엇인가.

 

None은 다른 프로그래밍 언어에서의 NULL이다. 

즉, 아무것도 없는 데이터를 의미한다.

파이썬은 모든 데이터가 객체로 이루어져 있으므로, None 역시 NoneType이라는 객체로 이루어져 있고 싱글턴으로 동작한다. 

(싱글턴이란 오직 하나의 인스턴스만 생성하여 사용하는 것)

 

NaN은 Not a Number의 약자로 정의되거나, 표현되지 않는 부동소수점 값으로 Python에서는 float 타입이 된다.

무한대끼리의 나눗셈, ∞와 -∞의 덧셈 등 다양한 방법을 통해 NaN을 생성할 수 있고, NaN이 피연산자로 포함되는 어떠한 연산도 결과는 NaN이 된다. 이는 IEEE 754 표준에서 자세히 설명하므로 관심이 있는 사람은 찾아보기 바란다.

 

float('nan') == float('nan')
Out[8]: False

float('nan') is float('nan')
Out[9]: False

None is None
Out[10]: True

None == None
Out[11]: True

 

위 결과는 None과 NaN의 싱글턴여부, 값 구분 방식에 대해 나타낸다.

 is  연산자는 해당 객체의 주소, 즉 포인터를 비교하므로 하나만 생성하는 None 의 비교는 언제나 True이다.

그러나 NaN의 경우 float 객체를 생성한 것이므로 위 코드는 두 개의 float('nan') 객체가 생성된 것이고 False가 된다.

 

 ==  연산자는 값 자체를 비교하므로 None 연산은 True,

NaN의 경우 값 비교가 불가능하므로 False (정의되거나 표현되는 값이 아니므로)

 

따라서 NaN인지 확인하기 위해서 == 연산자를 통해 확인할 수 있다.

 

추가적으로 math 모듈에서는 isnan()

pandas 모듈에서는 isnull() 함수로

nan인지 확인하는 함수를 제공한다.

 

 

참고 URL

NaN 정의

https://en.wikipedia.org/wiki/NaN

 

NaN 확인 방법

https://riptutorial.com/ko/python/example/3973/%EB%AC%B4%ED%95%9C%EB%8C%80%EC%99%80-nan----%EC%88%AB%EC%9E%90%EA%B0%80-%EC%95%84%EB%8B%98--

Comments