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

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

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

반갑습니다~ 꽁냥이입니다. 지난 포스팅에서는 Pandas의 stack, unstack 메서드를 이용한 데이터 재구조화 방법을 알아보았는데요. 이번 포스팅에서는 wide_to_long 메서드를 이용한 데이터 재구조화 방법을 알아보겠습니다.

 

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

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

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

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


   데이터 재구조화(Reshape)하기 (feat. wide_to_long)

아래 그림은 wide_to_long을 이용한 데이터 재구조화 결과를 나타낸 것입니다. wide_to_long의 stubnames 인자에는 칼럼의 시작 문자 또는 이들의 리스트를 넘겨주게 되어 있는데요. 데이터 재구조화할 때 stubnames에 들어가는 인자 수만큼  새로운 칼럼이 추가되는 것을 알 수 있습니다(빨간색, 연두색 박스). 그리고 i 인자에는 id 변수로 사용할 칼럼명을 넘겨주게 됩니다(하늘색 박스). 그리고 j 인자에는 stubnames 인자에 넘겨준 문자열을 제외한 나머지 부분을 새로운 칼럼(YEAR)의 값으로 만들어줍니다(주황색).

 

Pandas wide_to_long을 통한 데이터프레임 재구조화

 

이제 코드를 통하여 wide_to_long 사용법을 알아봅시다.

 

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

 

import pandas as pd

data = {
   'AA2000' : ['a', 'b', 'c'],
   'AA2010' : ['x', 'y', 'z'],
   'BB2000' : [2.5, 3.3, 7.7],
   'BB2010' : [.1, 1.1, 4.1],
   'VALUE'     : [10, 20, 30]
      }

df = pd.DataFrame(data)
df['ID_NUMBER'] = df.index

df

 

 

이제 wide_to_long 메서드를 사용하여 데이터를 재구조화해보겠습니다.

 

wl_df = pd.wide_to_long(df, stubnames=['AA', 'BB'], i='ID_NUMBER', j='YEAR')
wl_df

 

 

이렇게 wide_to_long으로 재구조화 된 데이터를 원상복구 하는 방법은 없을까요? Pandas에서는 원상복구 방법을 따로 제공하진 않고 지난 포스팅에서 다룬 unstack을 이용하여 수동으로 바꿔줘야 합니다. 또한 칼럼명을 원상태로 하기 위한 작업도 필요하지요.

 

아래 코드는 wide_to_long으로 재구조화 된 데이터를 원래대로 돌려놓습니다. 칼럼 순서는 조금 달라요.

 

unstacked_df =  wl_df.unstack()

## 칼럼 변환 함수
def convert_colnames(x):
    if x[0] == 'VALUE':
        return 'VALUE'
    else:
        return f'{x[0]}{x[1]}'

unstacked_df.columns = unstacked_df.columns.map(convert_colnames) ## 칼럼 변환
original_df = unstacked_df.iloc[:,1:].reset_index() ## VALUE 칼럼이 두개 생겨서 하나는 제외
original_df

 


이번 포스팅에서는 wide_to_long을 이용한 데이터 재구조화 방법을 알아보았는데요. 사실 이러한 재구조화는 잘 쓰이지 않는 것 같아요. 이번에 처음 알았거든요. 그래도 어떤 분들에게는 부디 이번 포스팅이 도움이 되셨으면 좋겠습니다. 

 

다음에도 좋은 주제로 찾아뵐 것을 약속드리며 이상 포스팅 마치겠습니다. 안녕히 계세요.


댓글


맨 위로