HOWTO · Python
Python에서 NaN 값 확인
Python 스칼라, 리스트, NumPy 배열, Pandas 데이터에서 NaN 값을 확인하는 방법과 Pandas가 결측으로 인식하는 값의 개수를 세는 방법을 배웁니다.
이 페이지의 내용
NaN은 “Not a Number”를 뜻하는 특수한 부동소수점 값입니다. 단일 부동소수점 값이나 숫자형 부동소수점 값의 목록에는 math.isnan(), NumPy 배열에는 numpy.isnan(), Pandas 데이터에는 pandas.isna()를 사용하세요. 이 검사들은 NaN 또는 라이브러리가 정의한 결측값을 찾습니다. 데이터베이스의 SQL NULL을 검사하는 기능은 아닙니다.
math.isnan()으로 숫자와 목록 확인하기
Python의 math.isnan()은 값이 부동소수점 NaN이면 True, 일반적인 유한 부동소수점 값이면 False를 반환합니다. 숫자형 부동소수점 값으로 이루어진 목록에서는 리스트 컴프리헨션으로 각 항목에 이 함수를 적용할 수 있습니다. 이 함수는 실수를 입력으로 받으므로 문자열이나 임의의 객체에는 사용할 수 없습니다.
다음 예제를 실행해 보세요.
import math
value = 3.5
print(math.isnan(value))
False
목록의 각 값에도 같은 검사를 적용하면 됩니다.
import math
values = [1.0, float("nan"), 4.5]
checks = [math.isnan(value) for value in values]
print(checks)
[False, True, False]
단일 값의 결과가 False인 이유는 3.5가 NaN이 아니기 때문입니다. 목록 결과에서는 가운데의 True가 NaN을 나타냅니다. Python에서 불리언 값은 정수처럼 취급되므로 sum(checks)를 사용하면 True 항목의 개수를 셀 수 있습니다.
numpy.isnan()으로 NumPy 배열 확인하기
numpy.isnan()은 배열의 각 요소를 개별적으로 검사하고 입력과 모양이 같은 불리언 배열을 반환합니다. 코드에서 흔히 사용하는 np 별칭은 NumPy를 가리키므로 np.isnan()과 numpy.isnan()은 같은 함수입니다. 배열에 NaN 값을 넣을 때는 np.nan을 사용하세요.
import numpy as np
data = np.array([1.0, np.nan, 4.0])
print(np.isnan(data))
[False True False]
각 True는 NaN인 요소를, 각 False는 NaN이 아닌 값을 나타냅니다. 다차원 배열에서도 불리언 결과는 입력 배열의 모양을 유지하므로, 이 마스크를 사용해 조건에 맞는 요소를 선택할 수 있습니다.
pandas.isna()로 Pandas 결측값 확인하기
Pandas의 isna()는 입력의 인덱스와 모양에 맞는 불리언 Series 또는 DataFrame을 반환합니다. 모듈 함수인 pandas.isna()와 df.isna() 같은 객체 메서드는 Pandas가 결측값으로 인식하는 값을 찾아냅니다. isnull()도 같은 기능을 하는 Pandas 표기입니다. Pandas의 결측값 검사는 메모리에 있는 데이터에 적용되며, 데이터베이스에 SQL NULL이 있는지 조회하지는 않습니다.
import pandas as pd
df = pd.DataFrame({"A": [1.0, float("nan")], "B": [float("nan"), 2.0]})
missing = pd.isna(df)
print(missing.sum())
A 1
B 1
dtype: int64
불리언 DataFrame을 기본 열 축을 따라 합산하면 각 열의 결측값 개수를 얻을 수 있습니다. 이 예에서는 A와 B 열에 각각 Pandas가 결측값으로 인식하는 항목이 하나씩 있습니다.
value != value로 NaN 확인하기
일반적인 단일 부동소수점 NaN에서는 NaN이 자기 자신과 같지 않으므로 value != value의 결과가 True입니다. 다만 이 방법은 제한적인 대안이며, 모든 Python 데이터 유형에 사용할 일반적인 검사 방법은 아닙니다. 사용자 정의 객체는 비교 동작을 직접 정의할 수 있고, 배열과 비슷한 값은 요소별 결과를 반환할 수 있습니다. 입력 유형이 데이터와 맞는 경우에는 math.isnan(), numpy.isnan(), pandas.isna()를 사용하세요.