본문 바로가기

Data Handling/Data Preprocessing

결측치 처리하기 (삭제 / 대체)

순서

  1. 결측치(NaN)가 포함된 행 삭제하기 - dropna()
  2. 특정값/ 평균값/ 최빈값/ 중간값으로 대체하기 - fillna() / replace()  
  3. 이전/ 이후 값으로 대체하기 - fillna() / shift()

 


 

■ 결측치(NaN)가 포함된 행 삭제하기

# 전체가 NaN인 행만 삭제 : how = 'all'
# NaN이 두 개 이상인 행만 삭제 : thresh = 2
# 특정 열에서만 결측치 확인하기 : subset = ['A_col','B_col',...]

data.dropna(axis = 0, how = 'any', inplace=True)

 


 

 특정 값/ 평균값/ 최빈값/ 중간값으로 대체하기 - fillna() / replace()  

- fillna()

data.fillna(0, inplace=True) # 특정값
data.fillna(data.mean(), inplace=True) # 평균값
data.fillna(data.median(), inplace=True) # 중간값
# 최빈값
most_v = data['특정 열 명'].value_counts(dropna=True).idxmax()
data['특정 열 명'].fillna(most_v, inplace=True)

 

- replace()

data.replace(np.nan, value=0, inplace=True) # 바꾸고자 하는 값을 value에 넣으면 됨

 


 

 이전/ 이후 값으로 대체하기 - fillna() / shift()

- fillna()

# limit = ? 로 이전/이후의 값으로 채우는 회수를 제한할 수 있음

data.fillna(method='ffill', inplace=True) #이전값으로 대체 (method='pad'도 가능)
data.fillna(method='bfill', inplace=True) #이후값으로 대체 (method='backfill'도 가능)

 

- shift()

# shift(1)의 직관적 해석 : 한 칸씩 밀겠다 -> 이전 값이 현재 값으로 밀렸다

data['A_col'][data['A_col'].isna()] = data.shift(1)['A_col'][data['A_col'].isna()] # 이전값
data['A_col'][data['A_col'].isna()] = data.shift(-1)['A_col'][data['A_col'].isna()] # 이후값