본문 바로가기

파이썬/전처리

파이썬 null 처리 방법, fillna()와 dropna()로 결측치 보정하기

데이터 전처리 과정에서 중요한 것 중 하나인 결측치 보정.

null값이 전혀 없는 데이터라면 참 좋겠지만 현실의 데이터에는 null값이 있는 데이터가 더 많다.

 

 

titanic 데이터셋으로 실습해보았다.

 

import pandas as pd
import numpy as np

data = pd.read_csv("titanic.csv")
data.info()

우선 info() 함수로 null값 확인을 할 수 있다. 전체 데이터가 891개인데 보면 age, embarked, deck, embark_town 컬럼은 non-null 개수가 891보다 작으므로 null값이 있음을 알 수 있다. info 함수는 결측치뿐만 아니라 컬럼 데이터타입 확인도 가능하다.

 

 

data.isnull()
data.isnull().sum()

isnull()함수를 사용하면 어떤 값이 null값인지 표시해준다. False는 null값이 아닌 것, True는 null값이다.

 

 

isnull().sum()함수를 쓰면 각 컬럼별로 null값이 몇 개가 있는지를 세어준다. 

 


이제 결측치를 처리해야 하는데 처리하는 방법은 여러가지가 있다.

 

1. 삭제하기 (dropna)

2. 0으로 채우기 (fillna)

3. 평균값/중앙값/최빈값 등으로 채우기 (fillna)

 

 

 

어떤 방법을 선택할 지는 해당 컬럼 혹은 데이터의 특성에 따라 다를 것이다. 위의 타이타닉 데이터에서 deck는 null값이 688개나 된다. 이런 경우에는 deck 컬럼이 생존률 예측에 크게 중요하지 않은 요소라고 판단된다면 컬럼 자체를 삭제하는 것도 방법이다.

 

 

삭제하기 (컬럼 drop / dropna)

data_2 = data.drop(columns='deck', axis=1, inplace=False)
data_2.head()

 

drop 함수를 사용해서 deck 컬럼을 삭제했다. inplace=True로 설정하면 기존 데이터프레임을 drop을 적용한 데이터프레임으로 대체한다는 의미이다. 보통은 원본 데이터 유지를 위해 False로 설정하는 것이 좋다.

 

 

컬럼 전체를 삭제하지 않고 dropna()함수로 결측치값만 삭제할 수도 있다.

data_2.dropna()

원래 891*15였는데 결측값 179개(age 177개, embark_town 2개)가 제거되었다.

 

 

채우기 (fillna)

data_3 = data_2.fillna(0)
data_3.isnull().sum()

fillna() 함수를 이용해서 널값을 모두 0으로 채웠다. 이렇게 하면 모든 null 값이 전부 0으로 채워진다.

 

 

이렇게 하지 않고 특정 컬럼만 null값을 처리해줄 수도 있다. 예를 들어 age컬럼의 null값을 전체 나이의 평균값으로 대체하고 싶다면 아래와 같이 코드를 짜면 된다.

data_3 = data_2.fillna({'age':data_2['age'].mean()})
data_3.isnull().sum()

이렇게 하면 age컬럼의 null값만 age컬럼의 평균값으로 대체된다. 

평균값뿐만 아니라 최소값, 최대값, 최빈값 등 다른 값으로도 충분히 대체할 수 있다.