데이터 재구조화(reshaping data)를 위해 사용할 수 있는 Python pandas의 함수들에 대해서 아래의 순서대로 나누어서 소개해보겠습니다.
- (1) pivot(), pd.pivot_table()
- (2) stack(), unstack()
- (3) melt()
- (4) wide_to_long()
- (5) pd.crosstab()
이번 포스팅에서는 세번째로 pd.melt() 사용법에 대해서 알아보겠습니다.
R 사용자라면 reshape package의 melt(), cast() 함수를 생각하면 쉽게 이해할 수 있을 것입니다. melt()는 pivot_table()과 함께 데이터 전처리 단계에서 자주 사용되곤 합니다.
melt() 는 ID 변수를 기준으로 원래 데이터셋에 있던 여러개의 칼럼 이름을 'variable' 칼럼에 위에서 아래로 길게 쌓아놓고, 'value' 칼럼에 ID와 variable에 해당하는 값을 넣어주는 식으로 데이터를 재구조화합니다. 말로 설명하자니 좀 어려운데요, 아래의 melt() 적용 전, 후의 이미지를 참고하시기 바랍니다.
필요한 라이브러리를 불러오고, 예제로 사용할 간단한 DataFrame을 만들어보겠습니다.
# importing libraries In [1]: import numpy as np In [2]: import pandas as pd In [3]: from pandas import DataFrame
# making an example DataFrame In [4]: data = DataFrame({'cust_ID' : ['C_001', 'C_001', 'C_002', 'C_002'], ...: 'prd_CD' : ['P_001', 'P_002', 'P_001', 'P_002'], ...: 'pch_cnt' : [1, 2, 3, 4], ...: 'pch_amt' : [100, 200, 300, 400]}) ...: In [5]: data Out[5]: cust_ID pch_amt pch_cnt prd_CD
|
(1) pd.melt(data, id_vars=['id1', 'id2', ...]) 를 사용한 데이터 재구조화 |
# melt() In [6]: pd.melt(data, id_vars=['cust_ID', 'prd_CD']) Out[6]: cust_ID prd_CD variable value
|
(2) pd.melt() 의 variable 이름, value 이름 부여하기 : var_name, value_name |
# # melt : assigning name of variable and value In [7]: pd.melt(data, id_vars=['cust_ID', 'prd_CD'],...: var_name='pch_CD', value_name='pch_value') Out[7]: cust_ID prd_CD pch_CD pch_value
|
(3) data vs. pd.melt() vs. pd.pivot_table() 비교해보기 |
melt()와 pivot_table() 이 비슷한거 같은데.... 뭔가 다른거 같기도 하고... 왜 비슷한것들을 여러개 만들어놔서 사람을 헷갈리게 하는 것일까 의아할 것 같습니다.
아래에 똑같은 data에 대해서 melt()와 pivot_table() 을 적용해보았습니다. melt()와 pivot_table()을 적용하고 난 이후의 index와 columns 을 유심히 살펴보시기 바랍니다. melt()는 ID가 칼럼으로 존재하는 반면에, pivot_table()은 ID가 index로 들어갔습니다.
# comparison among (a) data vs. (b) pd.melt() vs. pd.pivot_table()
# (a) data In [8]: data Out[8]: cust_ID pch_amt pch_cnt prd_CD
In [9]: data_melt = pd.melt(data, id_vars=['cust_ID', 'prd_CD'], ...: var_name='pch_CD', value_name='pch_value') In [10]: data_melt Out[10]: cust_ID prd_CD pch_CD pch_value In [11]: data_melt.index Out[11]: RangeIndex(start=0, stop=8, step=1) In [12]: data_melt.columns Out[12]: Index(['cust_ID', 'prd_CD', 'pch_CD', 'pch_value'], dtype='object')
In [13]: data_melt_pivot = pd.pivot_table(data_melt, index=['cust_ID', 'prd_CD'], ...: columns='pch_CD', values='pch_value', ...: aggfunc=np.mean) In [14]: data_melt_pivot Out[14]: pch_CD pch_amt pch_cnt In [15]: data_melt_pivot.index Out[15]: MultiIndex(levels=[['C_001', 'C_002'], ['P_001', 'P_002']], labels=[[0, 0, 1, 1], [0, 1, 0, 1]], names=['cust_ID', 'prd_CD']) In [16]: data_melt_pivot.columns Out[16]: Index(['pch_amt', 'pch_cnt'], dtype='object', name='pch_CD')
|
이상으로 Pytho pandas의 melt() 함수를 가지고 데이터 재구조화하는 방법에 대한 소개를 마치겠습니다.
다음번 포스팅에서는 wide_to_long() 함수에 대해서 알아보겠습니다.