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

[pandsa] NaN 위치에 데이터를 끌어 올리는 방법

by 김판다t 2024. 3. 19.

 

예제

 

import pandas as pd
data = {'반': ['A', 'A', 'A', 'B', 'B', 'B'], 
        '점수': [91, 90, 80, 90, 80, 70], 
        '국어': ['김판다', float('nan'), float('nan'), '최진환', float('nan'), float('nan')], 
        '영어': [float('nan'), '조민영', '안지선', float('nan'), '박연준', '권보아'], 
        '수학': [float('nan'), float('nan'), '강승주', float('nan'), float('nan'), '임재범']}
df = pd.DataFrame(data)

 

 

 

 

NaN 위치에 데이터를 끌어 올려 다음과 같은 데이터를 만들어 보자.

 

 

 

 

 

이럴 때 transform 함수를 이용해 재구성할 수 있다.

 

out = (df.set_index(['반', '점수'])
       .groupby(level=0)
       .transform(lambda s: s.sort_values(key=lambda x: x.isna()).values)
       .dropna(how='all').droplevel(1).reset_index()
)

 

 

out:

 

 

 

 

어렵다면 언피벗을 활용한 다음 코드를 사용해도 좋다.

 

out = (df.melt(['반', '점수']).dropna(subset='value')
       .assign(cc=lambda x: x.groupby(['반', 'variable']).cumcount())
       .pivot(index=['반', 'cc'], columns='variable', values='value')
       .droplevel(1).reset_index().rename_axis(None, axis=1)
       .reindex(df.columns.drop('점수'), axis=1)
)

 

 

결과는 동일하다.

 

 

 

 

 

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

 

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