stack, unstack 함수의 이해 및 활용하기

학습목표

  1. stack, unstack 함수 이해하기
import numpy as np
import pandas as pd
df = pd.DataFrame({
    '지역': ['서울', '서울', '서울', '경기', '경기', '부산', '서울', '서울', '부산', '경기', '경기', '경기'],
    '요일': ['월요일', '화요일', '수요일', '월요일', '화요일', '월요일', '목요일', '금요일', '화요일', '수요일', '목요일', '금요일'],
    '강수량': [100, 80, 1000, 200, 200, 100, 50, 100, 200, 100, 50, 100],
    '강수확률': [80, 70, 90, 10, 20, 30, 50, 90, 20, 80, 50, 10]
                  })

df
지역 요일 강수량 강수확률
0 서울 월요일 100 80
1 서울 화요일 80 70
2 서울 수요일 1000 90
3 경기 월요일 200 10
4 경기 화요일 200 20
5 부산 월요일 100 30
6 서울 목요일 50 50
7 서울 금요일 100 90
8 부산 화요일 200 20
9 경기 수요일 100 80
10 경기 목요일 50 50
11 경기 금요일 100 10

stack & unstack

  • stack : 컬럼 레벨에서 인덱스 레벨로 dataframe 변경
  • 즉, 데이터를 쌓아올리는 개념으로 이해하면 쉬움
  • unstack : 인덱스 레벨에서 컬럼 레벨로 dataframe 변경
  • stack의 반대 operation

  • 둘은 역의 관계에 있음
new_df = df.set_index(['지역', '요일'])
new_df
강수량 강수확률
지역 요일
서울 월요일 100 80
화요일 80 70
수요일 1000 90
경기 월요일 200 10
화요일 200 20
부산 월요일 100 30
서울 목요일 50 50
금요일 100 90
부산 화요일 200 20
경기 수요일 100 80
목요일 50 50
금요일 100 10
new_df.index
MultiIndex([('서울', '월요일'),
            ('서울', '화요일'),
            ('서울', '수요일'),
            ('경기', '월요일'),
            ('경기', '화요일'),
            ('부산', '월요일'),
            ('서울', '목요일'),
            ('서울', '금요일'),
            ('부산', '화요일'),
            ('경기', '수요일'),
            ('경기', '목요일'),
            ('경기', '금요일')],
           names=['지역', '요일'])
# 첫번째 레벨의 인덱스를 컬럼으로 이동
new_df.unstack(0) 
강수량 강수확률
지역 경기 부산 서울 경기 부산 서울
요일
금요일 100.0 NaN 100.0 10.0 NaN 90.0
목요일 50.0 NaN 50.0 50.0 NaN 50.0
수요일 100.0 NaN 1000.0 80.0 NaN 90.0
월요일 200.0 100.0 100.0 10.0 30.0 80.0
화요일 200.0 200.0 80.0 20.0 20.0 70.0
# 두번째 레벨의 인덱스를 컬럼으로 이동
new_df.unstack(1)
강수량 강수확률
요일 금요일 목요일 수요일 월요일 화요일 금요일 목요일 수요일 월요일 화요일
지역
경기 100.0 50.0 100.0 200.0 200.0 10.0 50.0 80.0 10.0 20.0
부산 NaN NaN NaN 100.0 200.0 NaN NaN NaN 30.0 20.0
서울 100.0 50.0 1000.0 100.0 80.0 90.0 50.0 90.0 80.0 70.0
from IPython.display import Image
Image("stack.png")

output_8_0

# 첫번째 레벨의 컬럼을 인덱스로 이동
new_df.unstack(0).stack(0)
지역 경기 부산 서울
요일
금요일 강수량 100.0 NaN 100.0
강수확률 10.0 NaN 90.0
목요일 강수량 50.0 NaN 50.0
강수확률 50.0 NaN 50.0
수요일 강수량 100.0 NaN 1000.0
강수확률 80.0 NaN 90.0
월요일 강수량 200.0 100.0 100.0
강수확률 10.0 30.0 80.0
화요일 강수량 200.0 200.0 80.0
강수확률 20.0 20.0 70.0
new_df.unstack(0).stack(1)
강수량 강수확률
요일 지역
금요일 경기 100.0 10.0
서울 100.0 90.0
목요일 경기 50.0 50.0
서울 50.0 50.0
수요일 경기 100.0 80.0
서울 1000.0 90.0
월요일 경기 200.0 10.0
부산 100.0 30.0
서울 100.0 80.0
화요일 경기 200.0 20.0
부산 200.0 20.0
서울 80.0 70.0
new_df.stack
<bound method DataFrame.stack of          강수량  강수확률
지역 요일             
서울 월요일   100    80
   화요일    80    70
   수요일  1000    90
경기 월요일   200    10
   화요일   200    20
부산 월요일   100    30
서울 목요일    50    50
   금요일   100    90
부산 화요일   200    20
경기 수요일   100    80
   목요일    50    50
   금요일   100    10>