반응형
파이썬에서 데이터 가공을 위해 가장 어려운 부분중 하나가 결측치 데이터 입니다.
데이터 가공시 많이 사용하는 데이터프레임에서 결측치 데이터를 삭제하고 처리하면 가장 깔끔하겠지만 일부 항목에서 부분 결측치의 경우 행 전체를 삭제하기 어려움이 발생합니다.
값이 누락된 경우 해당 열의 데이터 타입의 특성에 따라 NaN, None 과 같이 다르게 보이게 됩니다.
이와 같은 값을 포함한 채 데이터 가공을 하는 방법에 대해 몇가지 예시를 들어 설명하고자 합니다.
1. NaN 과 None 의 차이
- NaN (Not a Number)
- 수치형 데이터 타입에서 숫자가 아닌 값을 나타냄
- NaN 의 타입은 'float' 로 수치연산에 포함될 수 있으며 연산 결과는 NaN 으로 유지
- 예를들어 Pandas 나 Numpy 에서는 수치형 데이터의 결측값을 NaN 으로 처리
- None
- 파이썬에서 값이 없음을 나타내는 객체
- 다른 언어의 null 과 유사
- 특정 값이 없거나 정의되지 않음을 나타냄
- 예를들어 함수의 반환값이 없거나 변수에 값이 할당되지 않았음을 나타낼 때 사용
2. 파이썬 데이터 가공시 결측값을 확인하는 방법
👉 결측값이 NaN 인 경우
- math.isnan()
- math 라이브러리 이용
- 앞에 not 을 붙이면 NaN 이 아닌 조건에서 데이터 가공을 하고, NaN 인 경우 가공작업 없이 바이패스 가능
import math
x = 5.0 # NaN이 아닌 값으로 예시를 변경했습니다
if not math.isnan(x):
print("x는 유효한 숫자입니다.")
else:
print("x는 NaN입니다.")
- numpy.isnan()
- numpy 사용이 NaN 을 구분하는 방법
- NaN 이 아닌 데이터만 골라내기 위해 '~' 을 사용
import numpy as np
x = np.array([1.0, 2.0, np.nan, 4.0])
valid_numbers = x[~np.isnan(x)]
print("유효한 숫자들:", valid_numbers)
- pandas.isna()
- pandas에서 NaN 구분하는 방법
- NaN이 아닌 데이터는 notna() 를 사용
import pandas as pd
s = pd.Series([1.0, 2.0, np.nan, 4.0])
valid_values = s[s.notna()]
print("유효한 값들:", valid_values)
- 직접 비교 방법
- 함수를 사용하지 않고 NaN 의 특성을 활용
- 자기 자신과 같지 않기 때문에 np.nan == np.nan 값은 False
x = 5.0 # NaN이 아닌 값으로 예시를 변경했습니다
if x == x:
print("x는 유효한 숫자입니다.")
else:
print("x는 NaN입니다.")
👉 결측값이 None 인 경우
- 직접 비교 (권장사항)
- if문에서 None 여부를 바로 판단하고 처리 로직 적용
- 바로 직관적으로 'is' 사용하여 확인
x = None # 테스트를 위해 x에 None을 할당
if x is None:
print("x는 None입니다.")
else:
print("x는 None이 아닙니다.")
- 부정 비교
- if문에서 is not 사용하여 None 여부를 판단
x = 5 # 테스트를 위해 x에 임의의 값을 할당
if x is not None:
print("x는 None이 아닙니다.")
else:
print("x는 None입니다.")
- Boolean 컨택스트 사용 (주의 필요)
- None 자체로 False 로 판단
- 하지만 데이터에 '0', 'False' 가 있는 경우와 구분이 안되어 사용에 주의가 필요 (None 만 구분되지 않음)
x = None
if not x:
print("x는 None이거나 False로 평가되는 값입니다.")
else:
print("x는 True로 평가되는 값입니다.")
이와 같이 NaN 과 None 의 차이점과 확인하는 방법에 대해 몇가지 알아보았습니다.
특히 데이터프레임의 가공시 함수를 많이 사용하는데 중간에 결측값의 예외처리가 없으면 오류가 나는 경우가 많아 사전에 결측치의 종류와 빈도를 확인하고 어떻게 처리할 것인지 방향을 잡는 것이 필요합니다.
참고로 데이터의 구조와 건수는 df.info() 로 확인이 가능합니다.
결측값을 잘 못 처리하면 데이터 가공에 어려움이 있어서 이러한 어려움 겪은 많은 분들께 도움이 되었으면 합니다.
반응형
'파이썬(Python)' 카테고리의 다른 글
파이썬-우편번호API 이용 우편번호 찾기(1) (1) | 2024.12.19 |
---|---|
데이터프레임 데이터 정렬하기 - 다양한 옵션 활용 (0) | 2024.11.18 |
[업무자동화]파이썬으로 청구서 자동생성하기 (1) | 2024.07.14 |
판다스(Pandas)로 엑셀 파일 저장하기 - 두가지 방법 (0) | 2024.07.14 |
판다스(Pandas)로 엑셀 파일 불어오기 - 두가지 방법 (1) | 2024.06.30 |