본문 바로가기
Programming

[Pandas] NaN 데이터 채우기

by 느리게 걷는 즐거움 2022. 1. 3.
반응형

결측 데이터의 보강 .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)으로 채워진 것을 확인할 수 있습니다.

반응형