본문 바로가기
Data Analysis/Python

[Python] 결측치 처리 심화 (groupby, transform 함수)

by Toritol 2023. 8. 29.
728x90

 이번 글에서는 python에서 결측치 처리하는 데 있어서, groupby()transform() 함수를 같이 사용하는 방법에 대해 살펴보고자 합니다. 우선 환자들에 대한 체온, 심박수 등 기본적인 정보에 대한 데이터가 있다고 가정하겠습니다. 수행하고 싶은 전처리는 데이터에 결측치가 존재할 때, 해당 결측치를 환자의 평균값으로 대치하는 것입니다. 예를 들어, A 환자의 심박수에 결측치가 존재하게 되는 경우, 해당 데이터는 A 환자의 평균 심박수로 대치되는 것입니다.

 

 for 구문을 통해 각 환자별 데이터를 추출하고, 결측치가 존재한다면 환자의 평균값을 계산하여 결측치를 대치할 수도 있습니다. 하지만 더 간단한 코드로 해당 과정을 수행하기를 원했고, 검색하다가 찾은 방법이 groupby()transform() 함수를 결합한 방법입니다.

 

 groupby() 함수는 대부분 익숙하실 것이기 때문에, transform() 함수에 대해 간단하게 살펴보겠습니다. transform() 함수 예시는 PN님의 블로그에서 가져왔습니다. 다음과 같은 데이터가 있습니다.

 

import pandas as pd
import numpy as np

df = pd.DataFrame(np.array([[0, 1, 1, 0], [0, 1, 0, 1], [1, 2, 3, 4]]), 
                  columns=['a', 'b', 'c', 'd'])
df
   a  b  c  d
0  0  1  1  0
1  0  1  0  1
2  1  2  3  4

 

 아래와 같이 labmda를 활용하여 각 데이터에 10을 더하도록 입력하면, transform() 함수가 각 열에 10을 더해줍니다.

 

df_modified = df.transform(func = lambda x : x + 10)
df_modified
    a   b   c   d
0  10  11  11  10
1  10  11  10  11
2  11  12  13  14

 

 이제 위에서 설명한 예시를 통해 살펴보겠습니다. 데이터는 아래와 같이 환자 A, B, C의 체온과 심박수에 대한 정보가 포함되어 있습니다. 하지만 데이터 일부에 결측치가 존재하는 것을 볼 수 있습니다.

 

import pandas as pd
import numpy as np

patient_df = pd.DataFrame({'patient': ['A', 'A', 'A', 'B', 'B', 'B', 
                                       'C', 'C', 'C'],
                           'time': ['D', 'E', 'N', 'D', 'E', 'N', 
                                    'D', 'E', 'N'],
                           'temperature': [36.7, 36.6, np.nan, 36.4, 36.5, 36.4, 
                                           36.8, np.nan, 36.9],
                           'bpm': [80, 90, 85, 100, 95, np.nan, 
                                   np.nan, 70, 75]})
                           
patient_df

 

 

 groupby()와 transform() 함수를 통해, 체온에 대한 결측치를 환자별 평균값을 대치하는 코드는 다음과 같습니다. 우선 환자를 기준으로 groupby한 이후, index를 통해 결측치 처리를 수행할 열을 추출합니다. 다음에 transform() 함수를 적용하고, lambda를 통해 각 데이터에 어떠한 연산을 수행할지 입력해 줍니다. 저는 결측치를 평균값으로 대치하려고 했으므로, fillna()와 mean() 함수를 사용했습니다. 체온의 결측치가 평균값으로 잘 대치된 것을 확인할 수 있습니다.

 

patient_df['temperature'] = patient_df.groupby('patient')['temperature'].transform(lambda x: x.fillna(x.mean()))

patient_df

 

 

 여러 열에 대한 결측치 처리를 수행하고 싶은 경우, 다음과 같이 해당 열들을 미리 변수로 설정해주고 입력하면 됩니다.

 

columns = patient_df.columns[2:]
patient_df[columns] = patient_df.groupby('patient')[columns].transform(lambda x: x.fillna(x.mean()))

 

 

 

728x90

'Data Analysis > Python' 카테고리의 다른 글

[Python] Configuration 관리 및 사용  (2) 2023.04.21
[Python] Python과 PostgreSQL 연동  (0) 2022.11.24

댓글