본문 바로가기
Python/Basic Data Analysis

[Python] Missing Data(NA, NaN) 결측값 처리

by JKyun 2017. 12. 6.

안녕하세요. 우주신 입니다.

 

데이터 분석에 있어 가장 중요한 과정은 결측값 및 특이값을 얼마나 잘 처리하는지의 유무에 달려 있다고 생각하는데요,

오늘은 pandas를 이용하여 NA, NaN 데이터를 처리하는 가장 기본적인 몇가지 방법을 포스팅 하겠습니다.

 

df.dropna(), df.fillna()

 

우선, 결측값이나 특이값을 처리하는 3가지 방법이 있습니다.

 

1. 무시한다

2. 제거한다

3. 다른 값으로 대체한다

 

먼저, pandas와 numpy를 이용해 NaN 값이 포함된 데이터프레임을 만들었습니다.

import pandas as pd
import numpy as np

df = pd.DataFrame([[1, np.nan, 2, np.nan],
                  [3, np.nan, 4, 5],
                  [5, 6, 7, np.nan],
                  [np.nan, np.nan, np.nan, np.nan]],
                 columns = list('ABCD'))

 

1. 첫번째 방법은 아주 쉬워요. 그냥 무시하시면 됩니다.

추후 데이터 분석을 하는 데 있어 다른 방법으로 잘 처리해야 한다는 전제가 있다만요..

 

2. df.dropna()

 

NaN이 하나라도 들어간 행을 제거하는 방법에 대해 보겠습니다.

df.dropna()
df.dropna(how='any')

how의 default 값이 'any' 이므로 두 코드는 같은 의미 입니다.

즉, any -> 하나라도 결측값이 존재한다면 그 결측 값이 존재하는 행 or 열을 지우는 기능 입니다.

여기서 행 or 열을 설정하려면 파라미터 axis를 0 아니면 1로 조정해주면 됩니다.

위 코드를 실행하면 아래와 같은 빈 데이터프레임이 나오죠. 모든 행에는 NaN이 하나 이상 존재하기 때문 입니다.

 

자, 그럼 만약 어떠한 행에 모든 값이 NaN인 경우에만 지우고 싶은 경우에는 어떻게 하면 될까요?

how의 값을 'all'로 바꿔주면 됩니다. 매우 직관적인 것 같네요.

 

 

3. df.fillna()

 

마지막으로 NaN 값을 다른 값으로 대체하는 방법에 대해 보겠습니다.

원하는 특정 값을 df.fillna()의 parameter 중 하나인 value에다가 입력해주면 모든 NaN 값이 다 바뀝니다.

df.fillna(0)
df.fillna(value=0)

0을 넣어봤고 위와 같이 모든 결측값이 다 0으로 바뀌었습니다. 

 

이번에는 열마다 다른 값을 입력하여 NaN 값을 변경해보겠습니다.

new_data = {'A':0, 'B':-11, 'C':-99}
df.fillna(new_data)

a에는 0이 b에는 -11이 c에는 -99로 데이터가 변경됐습니다.

 

더 나아가 fillna 함수의 경우에는 다양한 기능이 있는데,

연속된 NaN 값 중 몇번째 값까지 변경을 원하는지도 limit을 통해 지정할 수 있습니다.

new_data = {'A':0, 'B':-11, 'C':-99}
df.fillna(new_data, limit=2)

각 열에서 2번째 NaN까지 값들이 변경된 것을 확인할 수 있어요.

 

마지막으로, df.fillna(method = ) 기능 입니다.

method = ffillmethod = bfill을 비교해 보겠습니다.

 

ffill은 forward fill의 약자로, 앞으로 채워라 라는 뜻 입니다.

df.fillna(method='ffill')

3행을 보시면 NaN의 값이 그 앞 데이터로부터 채워진 것을 확인할 수 있어요.

 

bfill은 back fill의 약자로, 반대로 존재하는 데이터로부터 뒷 방향(=위)으로 채워라 라는 뜻 입니다.

df.fillna(method='bfill')

NaN의 값이 그 뒤 데이터로부터 채워진 것을 확인할 수 있습니다.

 

 

 

 

댓글