17-02 피벗화, 열의 인덱스화 (stack)
DataFrame.stack(level=- 1, dropna=True)
개요
stack 메서드는 열을 피벗하여 하위 인덱스로 변환하는 메서드입니다.
사용법
기본 사용법
※ 자세한 내용은 아래 예시를 참고 바랍니다.
df.stack(level=- 1, dropna=True)
level : MultiColumns의 경우 하위인덱스로 변환할 열의 레벨입니다. 기본값은 -1로 최하위 레벨이 선택됩니다. dropna : {True / False} 기본값은 True로 피벗화로인해 생성된 하위인덱스의 모든 값이 결측치(NaN)인 경우 해당 열이 제거됩니다.
예시
먼저 기본적인 사용법 예시를위하여 멀티인덱스 데이터를 만들어보겠습니다.
data = [[0,1,2,3],[4,5,6,7],[8,9,10,11],[12,13,14,15]]
idx = [['idx1','idx1','idx2','idx2'],['row1','row2','row3','row4']]
col = [['val1','val1','val2','val2'],['col1','col2','col3','col4']]
df = pd.DataFrame(data = data, index = idx, columns = col)
print(df)
>>
val1 val2
col1 col2 col3 col4
idx1 row1 0 1 2 3
row2 4 5 6 7
idx2 row3 8 9 10 11
row4 12 13 14 15
기본적인 사용법
'level'의 기본값은 '-1'로 최하위 레벨이 선택됩니다. 위 df에서는 level=1이 최하위 계층이기 때문에,
df.stack( ) = df.stack(level=1) 입니다. 함수 실행 시 level=1의 열이 인덱스로 피벗된걸 확인할 수 있습니다.
print(df.stack())
>>
val1 val2
idx1 row1 col1 0.0 NaN
col2 1.0 NaN
col3 NaN 2.0
col4 NaN 3.0
row2 col1 4.0 NaN
col2 5.0 NaN
col3 NaN 6.0
col4 NaN 7.0
idx2 row3 col1 8.0 NaN
col2 9.0 NaN
col3 NaN 10.0
col4 NaN 11.0
row4 col1 12.0 NaN
col2 13.0 NaN
col3 NaN 14.0
col4 NaN 15.0
level=0인 경우 아래와같이 'val1', 'val2'가 포함된 level=0의 열이 피벗화 되는것을 볼 수 있습니다.
col1 col2 col3 col4
idx1 row1 val1 0.0 1.0 NaN NaN
val2 NaN NaN 2.0 3.0
row2 val1 4.0 5.0 NaN NaN
val2 NaN NaN 6.0 7.0
idx2 row3 val1 8.0 9.0 NaN NaN
val2 NaN NaN 10.0 11.0
row4 val1 12.0 13.0 NaN NaN
val2 NaN NaN 14.0 15.0
level=(0,1)처럼 튜플로 묶어줄 경우 해당되는 모든 계층에 대해 피벗화를 할 수 있습니다.
모든 계층(레벨)이 피벗화 될 경우 Serise 객체로 출력됩니다.
idx1 row1 val1 col1 0.0
col2 1.0
val2 col3 2.0
col4 3.0
row2 val1 col1 4.0
col2 5.0
val2 col3 6.0
col4 7.0
idx2 row3 val1 col1 8.0
col2 9.0
val2 col3 10.0
col4 11.0
row4 val1 col1 12.0
col2 13.0
val2 col3 14.0
col4 15.0
dtype: float64
dropna인수의 사용
dropna인수는 기본값이 True로 열이 피벗화된 인덱스의 값이 NaN이면 해당 열을 출력하지 않습니다.
예시를 위해 간단한 2x2 짜리 데이터를 만들어보겠습니다.
data = [[np.NaN,1],[2,3]]
idx = ['row1','row2']
col = ['col1','col2']
df = pd.DataFrame(data = data, index = idx, columns = col)
print(df)
>>
col1 col2
row1 NaN 1
row2 2.0 3
stack메서드를 사용할 경우 col1, col2 열이 인덱스로 피벗화되는데, row1-col1의 값은 NaN이기 때문에 출력에서는 아래와같이 제거됩니다.
print(df.stack())
>>
row1 col2 1.0 # row1에 대해서 col1의 값이 제거됨
row2 col1 2.0 # 모든 열이 피벗화 되었기 때문에 Series로 출력
col2 3.0
dtype: float64
dropna=True로 출력 할 경우 결측값을 갖는 열 또한 정상적으로 출력되는것을 볼 수 있습니다.
print(df.stack(dropna=False))
>>
row1 col1 NaN
col2 1.0
row2 col1 2.0
col2 3.0
dtype: float64
'파이썬완전정복-Pandas DataFrame > 17. 멀티인덱스' 카테고리의 다른 글
Pandas DataFrame 17-05 인덱스 제거 (droplevel) (0) | 2022.03.13 |
---|---|
Pandas DataFrame 17-04 인덱스 순서변경 (swaplevel) (0) | 2022.03.13 |
Pandas DataFrame 17-03 언피벗화, 행의 열로 변환 (unstack) (0) | 2022.03.13 |
Pandas DataFrame 17-01 하위분류반환 (xs) (0) | 2022.03.13 |