지난번에는 groupby와 pivot_table 을 통해 데이터를 일정 기준으로 묶어 재구성하는 법을 배웠다. 그냥 피봇테이블로 사용하려는 목적이라면 그정도로 끝내도 상관없지만, 머신러닝에서 컬럼별 영향력을 확인하기 위해서는 각각의 컬럼을 feature로 삼아 분석하는 것이 좋기 때문에, 멀티인덱싱이 되어있으면 분석 결과에 부정적인 영향을 미칠 수 있다.
그리고 python으로 피봇테이블만 만들거면... 차라리 UI로 빠르게 확인 가능한 엑셀을 사용하는 게 더 직관적일수도...
그런 이유로 이번에는 멀티인덱스 되어있는 데이터를 풀어주는 .unstack을 사용해볼 예정이다.
지난번에 그룹핑한 데이터이다. 보통 일자는 행렬에서 열로 사용하지 않는다. 이유는 분석이 어렵기 때문이다.
기본적인 내용이지만 열에는 하나의 상위 개념을 갖고 그 상위 개념이 가지는 value들이 들어가는 형태가 일반적이다. 그래야 통일된 하나의 개념에 다양한 값이 할당되기 때문이다. 그러나 위 행렬처럼 컬럼이 2018.1 이런식이면 그 내용이 상당히 지엽적이기 때문에 (즉 하나로 묶어주는 상위 개념 범위가 너무 좁음)
[일자 - 업종 - 광고주 - 상품 - 매체 - 항목] 순서 형태의 데이터로 변환해줄 예정이다.
이렇게 !
추가로 년, 월 컬럼을 새로 생성했는데, 이는 추후 시각화 및 머신러닝 과정에서 각 연도와 월의 영향력 등을 알아볼 수 있는 feature가 될 수 있다.
1. unstack()
unstack이란 무엇인가?
stack을 구글링하면 '사전적으로 Stack(스택)은 '쌓다', '더미'라는 의미를 가지고 있다. 접시를 차곡차곡 쌓아 올리듯이 데이터를 쌓아올리는 형상을 생각하면 된다. Stack(스택)은 Queue(큐)와 함께 자바에서 사용되는 가장 기본적인 자료구조 중 하나다. 라는 설명이 처음으로 나온다. (저만 그런가요?)
요컨대 '쌓다' 라는 의미를 가진 단어이다.
그렇다면 unstack은 반대로 쌓인 것을 풀어헤치는 뜻이 되겠다.
우리가 앞에서 만든 데이터는 인덱스가 상위 개념에서 하위 개념 순서대로 쌓여있었다. 이를 하나의 행으로 다 해체시키는 것이 이번 역할이다.
.unstack 이라는 method를 쓰는 것을 알았으니, 적용해보자.
Syntax: DataFrame.unstack(level=- 1, fill_value=None) |
level은 어느 수준까지 풀어해칠 것인가를 의미하고, fill_value는 nan 값에 대해 어떤 겂을 채울 것인지 넣어주면 된다.
level의 디폴트 값은 -1로 지정되어있는데, 전체를 풀어헤친다는 의미다.
지정한 변수에 넣어줘도 되지만 (df_), 바로 기존의 코드 뒤에 붙여줘도 괜찮다.
df_.unstack()
그러면
이런 모양이 나온다.
아니 인덱스 풀어주래서 풀어줬더니 항목이 컬럼으로 붙고 인덱스는 그대로 남아있는 결과를 뱉는가? 라고 물으신다면..
간단하게 설명하자면, unstack은 컬럼의 내용을 인덱스로 보내주는 함수이기 때문이다.
즉, 현재 데이터에서는 행렬전치를 먼저 행해줘야 인덱스의 모든 값들이 value로 펼쳐지게 된다.
df_.T.unstack().reset_index() #unstack은 인덱스로 반환을 해주기 때문에, 반드시 reset_index()를 적용해야만 원하는 값을 얻을 수 있다.
얼추 원하던 그림과 비슷한 모양이 나왔다.
참고로 unstack을 설명하기 위해 서치하던 중 굉장히 설명이 잘 되어있는 블로그를 발견했다.
https://gibles-deepmind.tistory.com/41
Pandas | Stack VS Unstack
안녕하세요 신입 초보 분석가입니다. 데이터 분석을 공부하면서 고민이 됐던 내용들을 포스팅합니다. github.com/GiblesDeepMind/deepPythonAnalysis GiblesDeepMind/deepPythonAnalysis I'm JDM! The man who wi..
gibles-deepmind.tistory.com
.stack과 .unstack에 대한 설명인데, 사실 전처리 하면서 일자가 모두 컬럼이 지정되어있는 진짜 더러운 데이터는 처음 만나봤기 때문에 행렬 전치를 하고 unstack을 사용했으나 (unstack 쓸 일이 훨씬 많았기 때문에 stack 함수는 사용을 하지 않았다.) 해당 포스트를 읽고 stack을 사용한 방법도 함께 진행해 보았다.
df_.stack().reset_index()
결과는 같게 나왔으므로, 이미지 첨부는 생략한다.
이 모든 과정들을 두 포스팅으로 나누어 설명했지만, 사실 이 코드들은 한 줄에 붙여서 아래의 네 가지 방식으로 표현이 가능하다.
#1
df_=df.groupby(['업종', '광고주', '상품', '매체', '항목']).sum().T.unstack().reset_index()
#2
df_=df.groupby(['업종', '광고주', '상품', '매체', '항목']).sum().stack().reset_index()
#3
df_=df.pivot_table(index=['업종', '광고주', '상품', '매체', '항목'], aggfunc='sum').T.unstack().reset_index()
#4
df_=df.pivot_table(index=['업종', '광고주', '상품', '매체', '항목'], aggfunc='sum').stack().reset_index()
이렇게!
쓰는 함수를 계속 쓸 수도 있지만 이렇게 다양한 방법으로 코드를 공부하고 짜는 것이 새로운 데이터를 만났을 때 어떤 방식으로 다루면 되는 지 각을 잡는 데에 도움이 많이 되는 것 같다. 이런 것도 있구나 하면서 써먹는 계기도 되는 것 같다.
이렇게 데이터를 재구성하고 해체, 행렬을 전치하는 방법까지 두 포스트에 걸쳐 알아봤다.
syntax의 경우 모두 pandas documentation (https://pandas.pydata.org/docs)에서 가져오고 있으니, 설명이 부족한 부분은 참고하여 다양한 파라미터와 함께 유용하게 사용하길 바란다. (우선 나부터..!)
'Python' 카테고리의 다른 글
[Python] 디렉토리 내 파일 불러오기 + 반복 작업 (os.listdir + 반복문) (0) | 2022.11.12 |
---|---|
[Pandas][Analysis] 데이터 분포 및 형태 알아보기: info, describe, boxplot, displot 등 (2) | 2022.10.23 |
[Python][Pandas] H&M Commerce Data (1) 전처리: 인덱스(.iloc)를 활용한 데이터 슬라이스 (데이터 쪼개기) (3) | 2022.09.09 |
[Pandas] index 설정, sequence id 컬럼 생성 (5) | 2022.08.31 |
[데이터전처리(1)][Pandas] DataFrame 그룹핑 (.groupby, .pivot_table) (0) | 2022.05.11 |