결측 데이터의 보강 .fillna()
NaN값을 특정 값으로 변경하는 경우 .fillna()를 사용할 수 있습니다. 아래와 같이 .fillna()를 이용하여 NaN값을 0으로 변경 했습니다.
df
a | b | c | d | |
---|---|---|---|---|
0 | NaN | NaN | NaN | NaN |
1 | 3.0 | 4.0 | 5.0 | NaN |
2 | 6.0 | 7.0 | 8.0 | NaN |
3 | 9.0 | 10.0 | NaN | NaN |
4 | NaN | 13.0 | 14.0 | NaN |
5 | 15.0 | 16.0 | 17.0 | NaN |
6 | 18.0 | 19.0 | 20.0 | NaN |
7 | NaN | NaN | NaN | NaN |
8 | 24.0 | 25.0 | 26.0 | NaN |
9 | 27.0 | NaN | 29.0 | NaN |
filled = df.fillna(0)
filled
a | b | c | d | |
---|---|---|---|---|
0 | 0.0 | 0.0 | 0.0 | 0.0 |
1 | 3.0 | 4.0 | 5.0 | 0.0 |
2 | 6.0 | 7.0 | 8.0 | 0.0 |
3 | 9.0 | 10.0 | 0.0 | 0.0 |
4 | 0.0 | 13.0 | 14.0 | 0.0 |
5 | 15.0 | 16.0 | 17.0 | 0.0 |
6 | 18.0 | 19.0 | 20.0 | 0.0 |
7 | 0.0 | 0.0 | 0.0 | 0.0 |
8 | 24.0 | 25.0 | 26.0 | 0.0 |
9 | 27.0 | 0.0 | 29.0 | 0.0 |
NaN값을 0으로 변경하는 경우 수학 연산 결과가 달라지는 것을 주의해야합니다. NaN은 값이 존재하지 않는 것이지만
0으로 변경하는 경우 해당 위치의 값이 존재하며 0의 값으로 적용됩니다.
NaN과 0값으로 변경된 데이터프레임의 .mean()값을 비교합니다.
df.mean()
NaN을 값으로 얻어진 평균값 입니다.
a 14.571429
b 13.428571
c 17.000000
d NaN
dtype: float64
0으로 채워진 데이터프레임인 filled의 평균값 입니다.
filled.mean()
NaN을 포함한 데이터프레임과 평균값이 다른 것을 알 수 있습니다.
a 10.2
b 9.4
c 11.9
d 0.0
dtype: float64
NaN을 포함하는 데이터프레임의 경우 NaN을 평균을 계산하기 위한 정보로 사용하지 않지만 0으로 값을 변경한
filled 데이터프레임은 0 값이 평균을 위한 정보로 사용되어 10개의 값에 대한 평균이 계산됩니다.
데이터프레임 값을 이용하여 NaN값을 채울 경우 정방향, 역방향 채우기를 사용할 수 있습니다.
df
a | b | c | d | |
---|---|---|---|---|
0 | NaN | NaN | NaN | NaN |
1 | 3.0 | 4.0 | 5.0 | NaN |
2 | 6.0 | 7.0 | 8.0 | NaN |
3 | 9.0 | 10.0 | NaN | NaN |
4 | NaN | 13.0 | 14.0 | NaN |
5 | 15.0 | 16.0 | 17.0 | NaN |
6 | 18.0 | 19.0 | 20.0 | NaN |
7 | NaN | NaN | NaN | NaN |
8 | 24.0 | 25.0 | 26.0 | NaN |
9 | 27.0 | NaN | 29.0 | NaN |
df.ffill()
a | b | c | d | |
---|---|---|---|---|
0 | NaN | NaN | NaN | NaN |
1 | 3.0 | 4.0 | 5.0 | NaN |
2 | 6.0 | 7.0 | 8.0 | NaN |
3 | 9.0 | 10.0 | 8.0 | NaN |
4 | 9.0 | 13.0 | 14.0 | NaN |
5 | 15.0 | 16.0 | 17.0 | NaN |
6 | 18.0 | 19.0 | 20.0 | NaN |
7 | 18.0 | 19.0 | 20.0 | NaN |
8 | 24.0 | 25.0 | 26.0 | NaN |
9 | 27.0 | 25.0 | 29.0 | NaN |
.ffill()을 사용하면 NaN값은 정방향의 직전 데이터를 이용하여 업데이트 됩니다. 7번 로우의 NaN값은 정방향의 직전 로우인
6번 로우의 값인 18, 19, 20, NaN으로 업데이트 되었습니다.
df.bfill()
a | b | c | d | |
---|---|---|---|---|
0 | 3.0 | 4.0 | 5.0 | NaN |
1 | 3.0 | 4.0 | 5.0 | NaN |
2 | 6.0 | 7.0 | 8.0 | NaN |
3 | 9.0 | 10.0 | 14.0 | NaN |
4 | 15.0 | 13.0 | 14.0 | NaN |
5 | 15.0 | 16.0 | 17.0 | NaN |
6 | 18.0 | 19.0 | 20.0 | NaN |
7 | 24.0 | 25.0 | 26.0 | NaN |
8 | 24.0 | 25.0 | 26.0 | NaN |
9 | 27.0 | NaN | 29.0 | NaN |
.bfill()을 사용하면 NaN값은 역방향의 직전 데이터를 이용하여 업데이트 됩니다. 7번 로우의 NaN값은 역방향의 직전 로우인
8번 로우의 값인 24, 25, 26, NaN으로 업데이트 되었습니다.
결측데이터 보간 .interpolate()
NaN값을 변경하기 위해서 선형보간법을 사용하는 경우 .interpolate()를 사용합니다. 선형보간법을 적용 시 보간에 사용되는
데이터사이의 관계를 지정하여 선형보간법의 거리관계를 정확히 표현할 수 있습니다.
df
a | b | c | d | |
---|---|---|---|---|
0 | NaN | NaN | NaN | NaN |
1 | 3.0 | 4.0 | 5.0 | NaN |
2 | 6.0 | 7.0 | 8.0 | NaN |
3 | 9.0 | 10.0 | NaN | NaN |
4 | NaN | 13.0 | 14.0 | NaN |
5 | 15.0 | 16.0 | 17.0 | NaN |
6 | 18.0 | 19.0 | 20.0 | NaN |
7 | NaN | NaN | NaN | NaN |
8 | 24.0 | 25.0 | 26.0 | NaN |
9 | 27.0 | NaN | 29.0 | NaN |
df.interpolate()
a | b | c | d | |
---|---|---|---|---|
0 | NaN | NaN | NaN | NaN |
1 | 3.0 | 4.0 | 5.0 | NaN |
2 | 6.0 | 7.0 | 8.0 | NaN |
3 | 9.0 | 10.0 | 11.0 | NaN |
4 | 12.0 | 13.0 | 14.0 | NaN |
5 | 15.0 | 16.0 | 17.0 | NaN |
6 | 18.0 | 19.0 | 20.0 | NaN |
7 | 21.0 | 22.0 | 23.0 | NaN |
8 | 24.0 | 25.0 | 26.0 | NaN |
9 | 27.0 | 25.0 | 29.0 | NaN |
.interpolate()함수를 사용하여 7번째 로우값이 6번과 7번 로우의 평균값(18+24 = 42/2 = 21)으로 채워진 것을 확인할 수 있습니다.
'Programming' 카테고리의 다른 글
[Linux] 명령어 정리 (0) | 2022.01.13 |
---|---|
[구글 스프레드] 차트의 가로/세로축 값 범위 변경 (0) | 2022.01.13 |
[구글스프레드] 다른 스프레드시트에서 값을 가져오기 (importrange) (0) | 2021.12.25 |
[구글스프래드] 하나의 값 여러개로 나누기 (0) | 2021.12.25 |
우분투 원격서버로 개발하기 (0) | 2021.12.18 |