본문 바로가기
판다스/판다스 팁

[pandas] 그룹별로 가장 가까운 값을 기준으로 NaN을 채우기

by 김판다t 2023. 5. 27.

Example Code

 

import pandas as pd
data = {'code': [1, 1, 2, 2, 2, 2, 3], 
        'year': [2000, 2001, 2000, 2001, 2002, 2003, 2000], 
        'val': [1.6, None, 1.4, None, None, 1.7, 0.1]}
df = pd.DataFrame(data)

 

df:

 

 


Problem

code열의 값을 그룹화해서 가장 가까운 값을 기준으로 df의 NaN을 채우고 싶다.


 

 

 

 

거리에 따라 전방 혹은 후방값으로 채울지가 정해지기에

단순히 전방값 혹은 후방값으로 NaN을 채우는 ffill, bfill 로는 수행이 불가능하다

 

 

 

 

Code

interpolate 함수를 nearest method로 적용하면 된다.

code열로 그룹화해서 적용해야 하니 groupby 함수도 사용하자

 

g = df.groupby('code')
g['val'].transform(lambda x: x.interpolate('nearest'))

 

 

0    1.6
1    NaN  <-- 대체되지 않음
2    1.4
3    1.4  <-- 위행의 값으로 대체
4    1.7  <-- 아래행의 값으로 대체
5    1.7
6    0.1
Name: val, dtype: float64

 

 

 

code열이 2인 그룹에서는 원하는 대로 결측값이 대체되었다.

다만 code열이 1인 경우에는 결측값이 대체되지 못했다.

이 경우 interpolate 함수의 특성으로 시작이나 끝에 존재하는 NaN은 값을 대체하지 못한 것이다.

 

 

 

시작이나 끝에 존재하는 NaN은  ffill과 bfill로 값을 부여하자.

결과는 df의 val 열로 수정하자.

 

g = df.groupby('code')
df['val'] = g['val'].transform(lambda x: x.interpolate('nearest').ffill().bfill())

 

df:

 

 

 

 

완성이다

 

 

 

 

유튜브에서 판다스 강의중입니다

https://www.youtube.com/@KimPandas/videos