달나라 노트

Python numpy : isnan (NaN값 다루기, None값 다루기, null값 다루기, NaN값 테스트, None값 테스트, nvl, coalesce, numpy isnan, math isnan, pandas isna) 본문

Python/Python numpy

Python numpy : isnan (NaN값 다루기, None값 다루기, null값 다루기, NaN값 테스트, None값 테스트, nvl, coalesce, numpy isnan, math isnan, pandas isna)

CosmosProject 2021. 8. 20. 19:00
728x90
반응형

 

 

 

어느 프로그래밍 언어에서나 데이터를 다룰 때 가장 중요한 부분 중 하나는 null, NaN, None 등의 값을 다루는겁니다.

어떤 데이터가 null 값일 때에는 다른 숫자를 return한다던지,

Pandas DataFrame의 어느 위치의 값이 NaN이면 해당 위치에 다른 값을 집어넣는다던지,

어떤 변수에 할당된 값이 NaN이라면 다른 값을 해당 변수에 재할당한다던지 등의 상황이 상당히 자주 발생합니다.

 

 

SQL에서는 null값을 다루기 위해 nvl, coalesce등의 함수가 있죠.

그러면 Python에서 None, NaN값을 다루기 위해선 어떻게 해야할까요?

 

 

 

이 방법을 알아보기 전에 Python에서 NaN과 None의 특징을 알아봅시다.

 

 

import numpy as np

print(np.NaN == np.NaN)  # 1
print(np.NaN == None)  # 2
print(np.NaN is None)  # 3
print(None == None)  # 4
print(None is None)  # 5



-- Result
False
False
False
True
True

1. numpy library에서 NaN값을 불러왔습니다.

결과를 보면 False로 나와있죠. NaN은 자기 자신과도 동일하지 않다는 결과(False)를 return합니다.

 

2. 자기 자신과도 동일하지 않은 NaN인데 None이랑 동일하다는 결과가 나올리가 없겠죠.

당연히 NaN과 None은 동일하지 않다는 결과(False)를 return하는걸 볼 수 있습니다.

 

3. 2번과 마찬가지로 등호 operator가 아니라 is operator를 사용해서 NaN과 None을 비교해도 동일하지 않다는 결과(False)가 나옵니다.

 

4. None은 NaN과는 다르게 자기 자신과는 동일하다는 결과(True)를 return합니다.

 

5. is operator를 사용해도 None은 자기 자신과 동일합니다.

 

 

 

 

 

 

 

import numpy as np

print(np.isnan(np.NaN))



-- Result
True

NaN값은 모든 값과 다르다는 결과를 내놓기에 단순한 등호 operator로는 NaN값을 테스트할 수 없습니다.

(기타 방법은 있지만 코드가 좀 길어지거나 직관적이지 않게 되겠죠.)

 

그래서 numpy에서는 isnan이라는 method를 지원합니다.

 

isnan method는 받은 argument가 NaN이면 True를 return합니다.

 

이렇게 NaN값을 테스트할 수 있습니다.

 

 

 

 

 

 

import numpy as np
import math

print(math.isnan(np.NaN))



-- Result
True

isnan method는 math library에서도 제공합니다.

사용법과 결과는 동일합니다.

 

 

 

 

 

 

 

import numpy as np
import pandas as pd

print(pd.isna(np.nan))



-- Result
True

pandas에 있는 isna method도 isnan method와 동일한 기능을 가지고있습니다.

 

아래 글은 pandas의 isna method관련 내용입니다.

https://cosmosproject.tistory.com/481

 

 

 

 

 

 

 

 

import numpy as np

def nan_tester(val):
    if np.isnan(val):
        print('This is NaN')
    else:
        print('This is not NaN')

val_test_1 = np.NaN
val_test_2 = 1

nan_tester(val_test_1)
nan_tester(val_test_2)



-- Result
This is NaN
This is not NaN

SQL의 nvl, coalese처럼 직접적으로 null값일 때 다른 값으로 대체해주는 함수 처럼

NaN값일 때 다른 값으로 대체해주는 직접적인 method는 아쉽게도 Python에서 제공되지 않습니다.

 

다만 isnan같은 위에서 본 NaN 테스트용 method를 가지고 위 예시의 nan_tester function을 만들어 사용할 수 있죠.

 

 

 

 

 

 

import numpy as np

def nan_tester(val):
    if val == val:
        print('This is not NaN')
    else:
        print('This is NaN')

val_test_1 = np.NaN
val_test_2 = 1

nan_tester(val_test_1)
nan_tester(val_test_2)



-- Result
This is NaN
This is not NaN

NaN값의 특징을 말할 때 NaN값은 모든 값, 심지어 자기 자신과도 같지 않다는 결과를 반환한다고했죠.

이걸 다시 생각해보면 NaN값을 제외한 모든 객체는 자기 자신과는 항상 동일하다는 결과(True)를 내놓습니다.

 

그러면 위처럼 자기 자신과의 등호(==)의 결과가 True면 이건 NaN값이 아니고, False면 NaN값이다라고 판단할 수 있으며,

이걸 이용해서 if문으로 NaN값 테스트가 가능하죠.

 

하지만 True, False의 의미가 직관적이지 않을 수 있습니다.

 

 

 

 

 

 

 

 

val_test = None

print(val_test == None)
print(val_test is None)



-- Result
True
True

None은 별도로 함수를 사용할 필요가 없습니다.

NaN과는 다르게 None은 자기 자신과는 동일하다는 결과(True)를 내놓기 때문에

위 예시처럼 등호나 is operator를 사용해서 None값을 테스트할 수 있습니다.

 

 

 

 

 

 

 

 

 

import numpy as np

val_test = None

print(val_test or 'new value')  # 1
print(np.NaN or 'new value')  # 2



-- Result
new value
nan

or operator는 왼쪽 값이 None일 때 오른쪽 값을 return합니다.

 

1. or의 왼쪽에 None값이 있기 때문에 오른쪽의 값인 new value를 return합니다.

2. or의 왼쪽에 NaN값이 있고, 이것은 None이 아니기 때문에 그냥 왼쪽의 값인 NaN을 return합니다.

 

 

 

 

 

 

import numpy as np

print(np.NaN + 2)
print(None + 1)



-- Result
nan
TypeError

추가로

NaN과 다른 숫자를 더할 경우 그 결과는 NaN입니다.

None과 다른 숫자를 더할 경우 더할 수 없다는 메세지와 함께 TypeError가 발생합니다.

 

 

 

 

 

 

728x90
반응형
Comments