반갑습니다~ 꽁냥이입니다. 지난 포스팅에서는 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)의 값으로 만들어줍니다(주황색).
이제 코드를 통하여 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을 이용한 데이터 재구조화 방법을 알아보았는데요. 사실 이러한 재구조화는 잘 쓰이지 않는 것 같아요. 이번에 처음 알았거든요. 그래도 어떤 분들에게는 부디 이번 포스팅이 도움이 되셨으면 좋겠습니다.
다음에도 좋은 주제로 찾아뵐 것을 약속드리며 이상 포스팅 마치겠습니다. 안녕히 계세요.
'데이터 분석 > 데이터 전처리' 카테고리의 다른 글
[Pandas] Tip!! 데이터프레임(Data Frame)을 필터, 칼럼 폭 조정, 첫 행 고정 옵션을 적용하여 엑셀로 저장하기(feat. xlsxwriter) (2) | 2022.12.07 |
---|---|
[Pandas] 34. 데이터 재구조화(Reshape)하기 (feat. crosstab) (2) | 2022.11.21 |
[Pandas] 32. 데이터 재구조화(Reshape)하기 (feat. stack, unstack) (2) | 2022.11.19 |
[Pandas] 31. 데이터 재구조화(Reshape)하기 (feat. pivot, pivot_table) (0) | 2022.11.19 |
[Pandas] 30. 데이터 재구조화(Reshape) 하기 (feat. melt) (4) | 2022.11.18 |
댓글