[Python pandas] 범주형 변수의 항목을 기준 정보를 사용하여 매핑해 변환하기: dict.get()
Python 분석과 프로그래밍/Python 데이터 전처리 2018. 8. 31. 00:44이번 포스팅에서는 Python pandas의 DataFrame에서 범주형 변수의 항목(class)을 기준 정보(mapping table, reference table)를 이용하여 일괄 변환하는 방법을 소개하겠습니다.
(1) 범주형 변수의 항목 매핑/변환에 사용한 기준 정보를 dict 자료형으로 만들어 놓고,
(2) dict.get() 함수를 이용하여 매핑/변환에 사용할 사용자 정의 함수를 만든 후에
(3) map() 함수로 (2)번에서 만든 사용자 정의 함수를 DataFrame의 범주형 변수에 적용하여 매핑하기
차근차근 예를 들어서 설명해보겠습니다.
먼저, 간단한 예제 데이터프레임을 만들어보겠습니다.
import pandas as pd from pandas import DataFrame df = DataFrame({'name': ['kim', 'KIM', 'Kim', 'lee', 'LEE', 'Lee', 'wang', 'hong'], 'value': [1, 2, 3, 4, 5, 6, 7, 8], 'value_2': [100, 300, 200, 100, 100, 300, 50, 80] }) df
|
위의 df 라는 이름의 DataFrame에서, name 변수의 (kim, KIM, Kim) 를 (kim)으로, (lee, LEE, Lee)를 (lee)로, 그리고 (wang, hong)을 (others) 라는 항목으로 매핑하여 새로운 변수 name_2 를 만들어보려고 합니다.
(1) 범주형 변수의 항목 매핑/변환에 사용할 기준 정보를 dict 자료형으로 만들기 |
name_mapping = { 'KIM': 'kim', 'Kim': 'kim', 'LEE': 'lee', 'Lee': 'lee', 'wang': 'others', 'hong': 'others' } name_mapping {'KIM': 'kim', 'Kim': 'kim',
'LEE': 'lee',
'Lee': 'lee',
'hong': 'others',
'wang': 'others'} |
(2) dict.get() 함수를 이용하여 매핑/변환에 사용할 사용자 정의 함수 만들기 |
dict 자료형에 대해 dict.get() 함수를 사용하여 정의한 아래의 사용자 정의 함수 func는 '만약 매핑에 필요한 정보가 기준 정보 name_mapping dict에 있으면 그 정보를 사용하여 매핑을 하고, 만약에 기준정보 name_mapping dict에 매핑에 필요한 정보가 없으면 입력값을 그대로 반환하라는 뜻입니다. 'lee', 'kim'의 경우 위의 name_mapping dict 기준정보에 매핑에 필요한 정보항목이 없으므로 그냥 자기 자신을 그대로 반환하게 됩니다.
func = lambda x: name_mapping.get(x, x)
|
(3) map() 함수로 매핑용 사용자 정의 함수를 DataFrame의 범주형 변수에 적용하여 매핑/변환하기 |
위의 기준정보 name_mapping dict를 사용하여 'name_2' 라는 이름의 새로운 범주형 변수를 만들어보았습니다.
df['name_2'] = df.name.map(func) df
|
(4) groupby() 로 범주형 변수의 그룹별로 집계하기 |
범주형 변수에 대해서 항목을 매핑/변환하여 새로운 group 정보를 만들었으니, groupby() operator를 사용해서 새로 만든 name_2 변수별로 연속형 변수들('value', 'value_2')의 합계를 구해보겠습니다.
# aggregation by name df.groupby('name_2').sum()
|
'name_2'와 'name' 범주형 변수 2개를 groupby()에 함께 사용하여 두개 범주형 변수의 계층적인 인덱스(hierarchical index) 형태로 'value_2' 연속형 변수에 대해서만 합계를 구해보겠습니다. (아래의 결과에 대해 unstack()을 하면 name 변수를 칼럼으로 올려서 cross-tab 형태로 볼 수도 있겠습니다.)
df.groupby(['name_2', 'name'])['value_2'].sum() name_2 name
kim KIM 300
Kim 200
kim 100
lee LEE 100
Lee 300
lee 100
others hong 80
wang 50
Name: value_2, dtype: int64
|
많은 도움이 되었기를 바랍니다.