본문 바로가기
데이터 분석/데이터 전처리

[Pandas] 32. 데이터 재구조화(Reshape)하기 (feat. stack, unstack)

by 부자 꽁냥이 2022. 11. 19.

안녕하세요~ 오늘도 꽁냥이 인사드립니다. 지난 포스팅에서는 Pandas pivot, pivot_table을 이용한 데이터 재구조화(Reshape) 방법을 알아보았는데요. 이번 포스팅에서는 stack, unstack 메서드를 이용한 데이터 재구조화(Reshape) 방법을 알아보겠습니다. 

 

[Pandas] 30. 데이터 재구조화(Reshape) 하기 (feat. melt)

[Pandas] 31. 데이터 재구조화(Reshape)하기 (feat. pivot, pivot_table)

[Pandas] 33. 데이터 재구조화(Reshape)하기 (feat. wide_to_long)

[Pandas] 34. 데이터 재구조화(Reshape)하기 (feat. crosstab)


   데이터 재구조화(Reshape)하기 (feat. stack, unstack)

아래 그림은 stack과 unstack 메서드를 이용한 데이터 재구조화(Reshape) 결과를 나타냅니다. stack은 위에서 아래로 데이터를 쌓아가는 방식이라면 unstack은 왼쪽에서 옆으로 데이터프레임을 재구조화합니다.

Pandas stack, unstack 재구조화

이제 개념을 알았으니 코드를 통해 stack과 unstack 메서드의 기본적인 사용 방법을 알아보겠습니다.

 

- 목차 -

1) stack

2) unstack


1) stack

먼저 예제용 데이터를 만들어줍니다.

 

import pandas as pd

df = pd.DataFrame([[80, 177], [50, 155]],
                    index=['Men', 'Women'],
                    columns=['weight', 'height'])
df

 

 

stack 메서드를 이용하여 데이터를 길게 재구조화(Reshape)해보겠습니다.

 

df.stack()

 

위 코드를 실행하면 아래와 같이 Pandas Series 객체가 만들어지네요.

 

 

stack 결과를 데이터프레임으로 만들어주려면 아래와 같이 데이터프레임 객체를 만들고 칼럼을 stack 처리된 Series를 넣어주면 됩니다.

 

temp_df = pd.DataFrame()
temp_df['Value'] = df.stack()
temp_df

 

 

이번엔 계층형 구조의 칼럼을 갖는 데이터프레임을 stack으로 재구조화해봅시다.

 

multicol = pd.MultiIndex.from_tuples([('Value', 'weight'),
                                       ('Value', 'height')])
df_multilevel_column = pd.DataFrame([[80, 177], [50, 155]],
                                    index=['Men', 'Women'],
                                    columns=multicol)
df_multilevel_column

 

 

이제 stack을 통한 데이터프레임 재구조화를 해봅시다~

df_multilevel_column.stack()

 

 

stack은 이 밖에도 결측이 포함된 데이터를 제거할 수 있는 dropna 인자를 제공합니다. 먼저 위 데이터에서 NaN을 임의로 하나 만들었습니다.

 

df = pd.DataFrame([[80, None], [50, 155]],
                    index=['Men', 'Women'],
                    columns=['weight', 'height'])

 

 

stack을 통한 데이터 재구조화할 때 NaN을 제거하고자 한다면 dropna = True, 그대로 유지하려면 dropna = False로 지정하면 됩니다.

df.stack(dropna = False)
# df.stack(dropna = True)

 

dropna = False (왼쪽) 와 dropna = True (오른쪽)


2) unstack

먼저 unstack은 stack을 통해 재구조화된 데이터프레임을 원래대로 복구시켜줍니다.

 

import pandas as pd

df = pd.DataFrame([[80, 177], [50, 155]],
                    index=['Men', 'Women'],
                    columns=['weight', 'height'])
df_stacked = df.stack() ## stack 재구조화
df_stacked.unstack() ## 원 상태로 변환

 

 

이번엔 순수하게 unstack을 통한 재구조화 방법을 알아보기 위해 데이터프레임을 만들어보겠습니다. 

 

multi_index = pd.MultiIndex.from_tuples([('Men', 'weight'),
                                         ('Men', 'height'),
                                         ('Men', 'IQ'),
                                         ('Women', 'weight'),
                                         ('Women', 'height')
                                      ])
df_multilevel_index = pd.DataFrame([80, 170, 130, 50, 155],
                                    index=multi_index,
                                    columns=['Value'])
df_multilevel_index

 

 

unstack을 이용하여 데이터프레임을 재구조화해보겠습니다.

 

df_multilevel_index.unstack()

 

 

위 결과를 보면 Women에는 IQ에 대응하는 값이 없기 때문에 NaN로 처리됩니다. 이를 다른 값으로 대체하고자 한다면 fill_value 인자를 사용하면 됩니다. 아래 코드는 NaN를 100으로 대체한 것입니다.

 

df_multilevel_index.unstack(fill_value=100)

 


이번 포스팅에서는 stack, unstack 메서드를 통한 데이터 재구조화 방법을 알아보았습니다. 부디 이번 포스팅이 많은 분들께 도움이 되시길 바라며 이상 포스팅 마치겠습니다. 감사합니다.


댓글


맨 위로