티스토리 뷰

728x90
반응형

 

 

데이터 결측치 처리에 사용할 데이터프레임을 만들어봅니다

 

import pandas as pd

file = pd.DataFrame([
    {'id': 1, 'val': None},
    {'id': 2, 'val': 21},
    {'id': 3, 'val': 19},
    {'id': 4, 'val': 24},
    {'id': None, 'val': 15},
    {'id': 5, 'val': 9},
    {'id': 6, 'val': 33},
    {'id': None, 'val': 40}
])

 

 

id에 null값 2개, val에 null값 1개를 넣어놨는데,

컬럼별로 결측치가 몇개 존재하는지 isnull()을 통해 존재여부를 확인해봅니다

 

 

# 결측치 존재여부 확인
file.isnull().sum()

 

 

결측치 처리에는 결측치를 제거하는방법, 결측치를 다른 값으로 대체하는 방법 이렇게 2가지가 있는데,
결측치를 제거하는 경우, 결측치가 포함된 열 또는 행이 삭제되므로 주의해야 합니다

 

제거 행 제거
열 제거
대체 이전행 값으로 대체 (pad/ffill)
다음행 값으로 대체 (bfill/backfill)
0으로 대체    
보간법 대체  
평균값으로 대체

 

 

1. 결측치가 포함된 행 제거

특정 행에 한 컬럼이라도 결측치가 존재하면 해당 행을 제거합니다.

# 행제거
file.dropna()

 

2. 결측치가 포함된 열 제거

특정 열에 하나라도 결측치가 존재하면 해당 열을 삭제합니다.

모든 컬럼에 결측치를 넣어놓았기 때문에 모든 컬럼이 삭제되었습니다.

# 열제거
file.dropna(axis='columns')

 

3. 이전행 값으로 대체 (pad/ffill)

결측치가 존재하는 경우, 해당 열의 이전인덱스 값을 가져와 대체합니다.

이전행이 없는 인덱스 0번 데이터의 경우 결측치가 변동되지 않음을 알 수 있습니다.

# 이전행 값으로 대체
file.fillna(method='pad')

 

 

4. 다음행 값으로 대체 (bfill/backfill)

결측치가 존재하는 경우, 해당 열의 다음인덱스 값을 가져와 대체합니다.

다음행이 없는 마지막 인덱스(7)의 경우 결측치가 변경되지 않음을 알 수 있습니다.

# 다음행 값으로 대체
file.fillna(method='bfill')

 

5. 원하는 값으로 대체

가장 무난한(...) 대체방법.

원하는 값으로 결측치를 대체합니다.

# 원하는 값으로 대체
file.fillna(0)

 

6. 보간법 대체

 

보간법 대체는 method 등의 파라미터를 어떻게 설정하느냐에 따라 달라지는데,

linear로 테스트 해보았을 때, 첫번째 인덱스에 있는 결측치가 변경되지 않음을 알 수 있습니다.

결측치 보간법에 대해서는 아래 블로그에 자세히 나와있으니 참고!

https://rfriend.tistory.com/264

 

[Python pandas] 결측값 보간하기 (interpolation of missing values) : interpolate(), interpolate(method='time'), interpolat

지난번 포스팅에서는 Python pandas 의 dropna() method를 사용해서  - 결측값이 들어있는 행 전체 제거하기  - 결측값이 들어있는 열 전체 제거하기 방법을 알아보았습니다. 이번 포스팅에서는 Python pan

rfriend.tistory.com

# 보간법 대체
file.interpolate(method='linear',limit_direction='forward')

 

 

7. 평균값으로 대체

열마다 결측치가 존재하는 경우 해당 열의 평균값으로(결측치제외)  결측치를 대체합니다.

# 평균값으로 대체
file.fillna(file.mean())

728x90
반응형
댓글