코테 준비하다가 까먹을까봐 정리하는 글!
파이썬에서 None, np.NaN, pd.NaT은 결측값을 의미한다.
이러한 결측 값을 확인하고 전처리하는 방법을 정리하고자 한다.
아래처럼 필요한 라이브러리를 호출해주고, 데이터프레임을 만든다.
import pandas as pd
students=pd.DataFrame({'이름':['장화','홍련','콩쥐','팥쥐','해님','달님'],
'국어':[70,85,None,100, None, 85],
'수학':[65,100,80, 95, None,70]})
결측치가 있는 데이터가 준비되었다.
🔍결측치 탐색
isna() 또는 notna()
isna()는 값이 결측치일 경우, True를 반환
notna()는 결측치가 아닐 경우, True를 반환
(참고로 isna()와 isnull()은 기능이 같은 함수이다.)
students.isna()
결측치를 True로 반환한 모습을 확인할 수 있다.
하지만 데이터가 대용량일 경우, 이러한 방식은 큰 효용이 없다.
따라서 sum()함수를 활용하여 결측치 개수를 확인한다.
students.isna().sum() #열별 결측치 개수
students.isna().sum(1) #행별 결측치 개수
🔍결측치 제거
결측치 개수가 적다면, 제거하는 방법도 하나의 전처리 기법이다.
dropna()함수로 결측치가 존재하는 행 또는 열을 삭제할 수 있다.
dropna()함수의 매개변수는 다음과 같다.
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
- axis : 0 또는 'index'이면 결측값이 포함된 행을 삭제하고, 1 또는 'columns'이면 결측값이 포함된 열을 삭제
- how : 'any'이면 결측값이 존재하는 모든 행/열 삭제, 'all'이면 모든 값이 결측값일 때 삭제
- thresh : 정수값을 지정하면 행 또는 열에서 결측값이 아닌 값이 그보다 많을 때 행 또는 열을 유지
- subset : 어떤 레이블에 결측값이 존재하면 삭제할지 정의
- inplace : True이면 제자리에서 작업을 수행하고 None을 반환=>원본데이터를 직접 변형하는 명령어(주의해야함)
'수학' 컬럼의 결측값이 있는 행만 제거하는 코드
students.dropna(subset='수학')
행에서 결측값이 아닌 데이터 개수가 2개이상인 데이터만 추출하는 코드
students.dropna(thresh=2)
🔍결측치 대체
결측치를 제거하는 방법 외에, 대체하는 방법도 있다.
fillna()함수를 이용한다.
함수의 매개변수는 다음과 같다.
DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None)
- value : 단일 값 혹은 dict/Series/DataFrame 형식으로 대체할 값을 직접 입력
- method : 'pad', 'ffill'은 이전 값으로 채움, 'backfill', 'bfill'은 다음에 오는 값으로 채움
- axis : 0 또는 'index'이면 행 방향으로 채우고 1 또는 'columns'이면 열 방향으로 채움
- limit : method 인자를 지정한 경우, limit으로 지정한 개수만큼만 대체할 수 있음
health=pd.DataFrame({'연도':[2017, 2018, 2019, 2020, 2021, 2022],
'키':[160, 162, 165, None, None, 166],
'몸무게':[53, 52, None, 50, 51, 54],
'시력': [1.2, None, 1.2, 1.2, 1.1, 0.8],
'병결': [None, None, None, 2, None, 1]})
health
결측값을 각 열의 평균값을 채우는 코드
health.fillna(health.mean())
결측값을 바로 직전의 값으로 채우는 코드
health.fillna(method='pad')