이번에는 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
'Python > Data analysis' 카테고리의 다른 글
[Python] Data Analysis - DataFrame - Melt (0) | 2023.04.08 |
---|---|
[Python] Data Analysis - DataFrame - Pivot (0) | 2023.04.08 |
[Python] Data Analysis - DataFrame - multi-column (0) | 2023.04.07 |
[Python] Data Analysis - DataFrame - multi-index (0) | 2023.04.06 |
[Python] Data Analysis - DataFrame - join (0) | 2023.04.06 |