You& Data_Science & Life

(Prep) Transpose DataFrame Shape (wide <-> long)

: 일상적인 데이터는 주로 각 피쳐를 column으로 가져가지만, 시각화를 필요로하는 경우엔 각 피쳐값을 하나에 컬럼에 모아, 다시 새로운 변수로 할당해주는 형태인 long-form 형태의 데이터 변환이 필요하다. 이때 주로 사용하는 함수들이 상황에 따라 매번 햇갈려 정리가 필요했다. 해당 자료는 “rfriend” 내용을 정리하였다.

1. Long to Wide (pivoting)

(1) pivot

: pd.pivot함수도 있으나, 기능이 유사하고 더 범용적인 pivot_table함수만 정리

pd.pivot_table(df, index=, columns=, values=)
  • index
    wide 형태 데이터에서, 인덱스 역할을 할 컬럼
  • columns
    N개의 Column을 생성하기 위한, 정보를 가져올 Column (2개 이상의 Column을 지정할 경우, 멀티 컬럼 형태의 WideFormData생성)
  • values
    Column에서 지정한 필드에 상응하는 값이 존재하는 Column
  • margins
    True로 설정시, 행과 열을 기준으로 합계(All, row sum, column sum)를 같이 제시

2. Wide to Long (melt)

: 주어진 WideFormData를 아래로 길게 녹여내듯 LongForm으로 변환

 pd.melt(data, id_vars=['id1', 'id2', ...])
  • id_vars
    longform 데이터의 인덱스 개념이 될 컬럼(column 레벨이며, index레벨이 아님.)
  • var_name
    (default : None) Category or Group과 같이 값의 구분자가 될 필드명
  • value_name
    (default : value) value값 column명

3. Stack <-> Unstack

: 앞서 pivot과 melt함수는, transpose를 위해 기준이 되는 column들을 인자로 지정해주었던 반면, Stack & Unstack 함수는 어떤 데이터를 주어주던 필요한 형태로 변환하는 목적에 충실한 느낌이다.

  • Stack : wide to “long”
  • Unstack : long to “wide”

(1) Stack

 pd.DataFrame.stack(level=-1, dropna=True)
data_wide
# [output]
#   cust_id	prod_cd	grade	pch_amt
# 0	c1	p1	A	30
# 1	c1	p2	A	10
# 2	c1	p3	A	0
# 3	c2	p1	A	40
# 4	c2	p2	A	15

data_wide.set_index(['cust_id', 'prod_cd']).\
 stack(level = -1).to_frame().head(10)
# [output]
#                           0
# cust_id	prod_cd		
# c1	p1	grade	    A
#               pch_amt	    30
#       p2	grade	    A
#               pch_amt	    10
#       p3	grade	    A
#               pch_amt	    0
# c2	p1	grade	    A
#               pch_amt	    40
#       p2	grade	    A
#               pch_amt	    15

(2) UnStack

 pd.DataFrame.stack(level=-1, dropna=True)
data_long
# [output]
#               0
# 0	grade	A
#       pch_amt	30
# 1	grade	A
#       pch_amt	10
# 2	grade	A
#       pch_amt	0
# 3	grade	A
#       pch_amt	40
# 4	grade	A
#       pch_amt	15


data_long.unstack()
#      grade	pch_amt
# 0	A	30
# 1	A	10
# 2	A	0
# 3	A	40
# 4	A	15

Reference

[1] 데이터 재구조화_1 : pivot & pivot_table
[2] 데이터 재구조화_2 : melt
[2] 데이터 재구조화_3 : stack & unstack