HOWTO · Python
Python의 목록에서 NaN 제거
이 자습서에서는 Python의 목록에서 NaN을 제거하는 방법을 보여줍니다.
이 페이지의 내용
NaN은 정의되지 않았거나 표현할 수 없는 숫자 결과를 나타낼 때 흔히 사용하는 특수 부동소수점 값입니다. 일반 문자열 'nan'과는 다릅니다. 숫자 목록에는 Python의 math.isnan()을 사용하고, 숫자 배열에는 NumPy의 numpy.isnan()을 사용하면 편리합니다. 문자열 'nan'을 제거하려면 문자열 값을 직접 비교하세요. 숫자형 NaN과 문자열 'nan'이 함께 있는 데이터라면 pandas.isnull()과 문자열 비교를 함께 사용하면 됩니다.
math.isnan()으로 Python 목록에서 NaN 제거하기
Python 표준 라이브러리의 math.isnan() 함수는 숫자형 NaN 값을 판별합니다. 이는 메서드가 아니라 함수입니다. NaN은 자기 자신과 같지 않으므로 x != x 같은 검사로도 찾을 수 있지만, math.isnan()을 사용하면 의도가 더 분명합니다. math.isnan()이 받을 수 있는 숫자 값이 목록에 있을 때 이 방법을 사용하세요. 임의의 문자열이나 객체를 판별하는 일반적인 검사는 아닙니다. math.isnan() 참고 문서를 확인하세요. 한국어 문서 대상은 제공된 링크 인벤토리에 없어 영어 링크를 유지했습니다.
다음 완전한 예제는 숫자 목록을 필터링하며 원래 목록은 변경하지 않습니다.
import math
values = [1, 2, float("nan"), 4]
without_nan = [value for value in values if not math.isnan(value)]
print(without_nan)
[1, 2, 4]
numpy.isnan()으로 Python 목록에서 NaN 제거하기
프로젝트에서 이미 NumPy를 사용한다면 numpy.isnan()으로 목록이나 배열의 숫자 값을 한 번에 검사할 수 있습니다. NumPy가 없다면 python -m pip install numpy로 설치하세요. 예제는 입력을 배열로 변환하고 불리언 마스크를 만든 다음, NaN이 아닌 값을 선택하고 결과를 다시 Python 목록으로 변환합니다. 따라서 최종 결과는 NumPy 배열이 아니라 목록입니다.
import numpy as np
values = [1, 2, np.nan, 4]
array = np.array(values)
without_nan = array[~np.isnan(array)].tolist()
print(without_nan)
[1.0, 2.0, 4.0]
Python 목록에서 문자열 ’nan’ 제거하기
문자열 표식은 부동소수점 NaN이 아니라 일반 텍스트입니다. 데이터가 이미 문자열 목록이라면 각 항목을 직접 비교해 정확히 소문자인 'nan' 값을 제거할 수 있습니다. 이렇게 하면 남은 항목의 형식과 철자는 그대로 유지됩니다. 데이터에 대문자 표기나 공백 규칙이 다르게 적용되어 있다면 비교 조건을 조정하세요.
values = ["1", "2", "nan", "8"]
without_string_nan = [value for value in values if value != "nan"]
print(without_string_nan)
['1', '2', '8']
각 항목을 먼저 str()로 변환하면 남는 숫자도 문자열이 됩니다. 데이터를 정규화할 때는 유용할 수 있지만 결과의 형식이 바뀝니다. 목록에 이미 들어 있는 문자열만 제거하려는 경우에는 변환할 필요가 없습니다.
pandas.isnull()로 혼합 Python 목록에서 NaN과 문자열 ’nan’ 제거하기
혼합 목록에서는 pandas.isnull()로 숫자형 NaN 같은 결측값을 판별하고, 별도의 조건으로 각 값이 문자열 'nan'인지 비교하세요. pandas.isnull()은 텍스트 'nan'을 결측값으로 취급하지 않습니다. 다음 예제를 실행하려면 pandas가 필요합니다(python -m pip install pandas). 이 예제는 다른 문자열과 숫자의 원래 형식을 유지합니다. pandas.isnull() 참고 문서에서 결측값 검사를 확인할 수 있습니다.
import pandas as pd
values = ["Ada", 23, "nan", "London", float("nan")]
without_missing_or_string_nan = [
value
for value in values
if not pd.isnull(value) and value != "nan"
]
print(without_missing_or_string_nan)
['Ada', 23, 'London']