분석을 하다 보면 원본 데이터의 구조가 분석 기법에 맞지 않아서 행과 열의 위치를 바꾼다거나, 특정 요인에 따라 집계를 해서 구조를 바꿔주어야 하는 경우가 있습니다.
재구조화(reshaping data)를 위해 사용할 수 있는 Python pandas의 함수들에 대해서 아래의 순서대로 나누어서 소개해보겠습니다.
- (1) pivot(), pd.pivot_table()
- (2) stack(), unstack()
- (3) melt()
- (4) wide_to_long()
- (5) pd.crosstab()
이번 포스팅에서는 pd.wide_to_long() 에 대해서 알아보겠습니다.
필요한 모듈을 불러오고, 실습에 필요한 간단한 예제 데이터셋을 만들어보겠습니다.
# importing libraries In [1]: import numpy as np In [2]: import pandas as pd In [3]: from pandas import DataFrame
In [4]: np.random.seed(10)
In [5]: data_wide = pd.DataFrame({"C1prd1" : {0 : "a", 1 : "b", 2 : "c"}, ...: "C1prd2" : {0 : "d", 1 : "e", 2 : "f"}, ...: "C2prd1" : {0 : 2.5, 1 : 1.2, 2 : .7}, ...: "C2prd2" : {0 : 3.2, 1 : 1.3, 2 : .1}, ...: "value" : dict(zip(range(3), np.random.randn(3))) ...: }) ...: In [6]: data_wide["seq_no"] = data_wide.index In [7]: data_wide Out[7]: C1prd1 C1prd2 C2prd1 C2prd2 value seq_no
|
이제 pd.wide_to_long() 함수를 써서 데이터를 재구조화 해보겠습니다.
wide_to_long()은 pivot() 이나 stack() 과는 다르게 "칼럼 이름의 앞부분"과 나머지 "칼럼 이름의 뒷부분"을 구분해서, 칼럼 이름의 앞부분을 칼럼 이름으로, 칼럼 이름의 나머지 뒷부분을 행(row)의 원소로 해서 세로로 길게(long~) 쌓아 줍니다. 말로 설명해주기가 참 힘든데요, 아래의 wide_to_long() 적용 전, 후의 변화 이미지를 참고하시기 바랍니다.
제가 R, SAS, SPSS 다 써봤는데요, Python의 pd.wide_to_long() 함수 같은거는 본 적이 없습니다. 좀 생소하고, 처음 봤을 때 한눈에 잘 안들어왔던 유형의 데이터 재구조화 함수예요.
pd.widt_to_long() 함수를 한번 사용해서 가로로 넓은 데이터(wide~)를 세로로 길게(long~) 재구조화 해보겠습니다.
(1) pd.wide_to_long(data, ["col_prefix_1", "col_prefix_2"], i="idx_1", j="idx_2") |
# reshaping a 'wide' DataFrame to a 'long' DataFrame In [8]: data_long = pd.wide_to_long(data_wide, ["C1", "C2"], i="seq_no", j="prd") In [9]: data_long Out[9]: value C1 C2
|
(2) pd.wide_to_long()에 의한 index, columns 변화 비교 |
# data_wide (original data set) : index, columns In [10]: data_wide.index Out[10]: Int64Index([0, 1, 2], dtype='int64') In [11]: data_wide.columns Out[11]: Index(['C1prd1', 'C1prd2', 'C2prd1', 'C2prd2', 'value', 'seq_no'], dtype='object')
In [12]: data_long.index Out[12]: MultiIndex(levels=[[0, 1, 2], ['prd1', 'prd2']], labels=[[0, 1, 2, 0, 1, 2], [0, 0, 0, 1, 1, 1]], names=['seq_no', 'type']) In [13]: data_long.columns Out[13]: Index(['value', 'C1', 'C2'], dtype='object')
|
이상으로 pd.wide_to_long() 을 이용한 데이터 재구조화 소개를 마치겠습니다.
다음번 포스팅에서는 pd.crosstab() 에 대해서 알아보겠습니다.
많은 도움 되었기를 바랍니다.