티스토리 뷰
데이터 결측치 처리에 사용할 데이터프레임을 만들어봅니다
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
# 보간법 대체
file.interpolate(method='linear',limit_direction='forward')
7. 평균값으로 대체
열마다 결측치가 존재하는 경우 해당 열의 평균값으로(결측치제외) 결측치를 대체합니다.
# 평균값으로 대체
file.fillna(file.mean())
'프로그래밍 > Python' 카테고리의 다른 글
[pandas] 데이터프레임 특정 열에 절대값 부여하기 pd.DataFrame Absolute value for specific column (abs) (0) | 2022.07.07 |
---|---|
[pandas] 데이터프레임 특정 컬럼 데이터타입 변경하기 (0) | 2022.07.06 |
[pandas] 2개 이상의 DataFrame join하기 (0) | 2022.07.01 |
[geopandas] gpd.sjoin를 사용하여 polygon 안에 point, polygon 포함되는지 확인하기 (0) | 2022.06.30 |
[오류해결] key 'keyname' must not contain '.' 오류 (0) | 2022.06.17 |