본문 바로가기

Python/Data analysis

[Python] Data Analysis - DataFrame - Stack / Unstack

이번에는 Stack / Unstack 에 대해서 알아보겠습니다.

 

가끔은 컬럼을 인덱스로 옮기거나 반대로 인덱스를 컬럼으로 옮기는것이 데이터를 다루는데 또는 이해하는데 효과적일 때가 있다.

stack 메서드는 컴럼을 인덱스로 변경할 수 있다.

반대로 unstack 메서드는 인덱스를 컬럼으로 변경한다.

 

 

df
-----------------------------------
	영업이익		당기순이익
	컨센서스	잠정치	컨센서스	잠정치
2020/06	100	900	800	700
2020/09	1200	1400	900	800

# 기본적으로 높은레벨(level 0 가 낮은 레벨임)의 컬럼이 인덱스로 변경된다
df.stack()
-----------------------------------
		당기순이익	영업이익
2020/06	잠정치	700	900
	컨센서스	800	100
2020/09	잠정치	800	1400
	컨센서스	900	1200

# level 옵션을 사용하면 특정 컬럼을 인덱스로 변경할 수 있다
df.stack(level=0)
-----------------------------------
		잠정치	컨센서스
2020/06	당기순이익	700	800
	영업이익	900	100
2020/09	당기순이익	800	900
	영업이익	1400	1200
    
# 2차 컬럼인 경우, stack 을 2번 사용하면 모든 컬럼 데이터가 인덱스로 이동한다
df.stack().stack()
-----------------------------------
2020/06  잠정치	당기순이익     700
             	 영업이익      900
         컨센서스  당기순이익     800
                 영업이익      100
2020/09  잠정치   당기순이익     800
                 영업이익     1400
         컨센서스  당기순이익     900
                 영업이익     1200
dtype: int64

 

 

 

unStack 예시

왼쪽의 데이터프레임에서 오른쪽 데이터를 추출하는 과정에서 사용됩니다.

 

 

1. 데이터를 스택처리하여 인덱스를 컬럼으로 변경한다

 

# 인덱스를 리셋해야한다.
# 안하면 시리즈로 변경된다. 외냐하면 level 이 1개이기때문이다.
df_stacked = df.stack().reset_index()
df_stacked

 

 

 

2. level_1 에서 데이터를 split 하고 데이터프레임으로 변경한다. 리스트를 생략하면 안된다.

 

df_split = DataFrame( list(df_stacked['level_1'].str.split('/')) )
df_split

 

 

 

3. 데이터 병합(concat, axis=1)      

 

import pandas as pd

df_merged = pd.concat( [df_stacked, df_split], axis=1 )
df_merged.columns = ['계정', "년월", "금액", "연도", "월"]
df_merged

 

 

 

4. 그룹핑

 

df_group = df_merged.groupby(["계정", "연도"]).sum()
df_group

 

 

 

5. unstack

 

df_unstack = df_group.unstack()
df_unstack

 

 

 

6. 그외 처리

 

result = df_unstack['금액']
result.columns.name = ''
result.index.name = ''
result