빅데이터 공부

[Pandas] 데이터 변형하기 - stack, unstack

왕초보코딩러 2024. 12. 8. 20:04
728x90

2024.10.22 - [빅데이터 공부] - [Pandas] 데이터 변형하기 - groupby

 

[Pandas] 데이터 변형하기 - groupby

1. groupby()2. pd.pivot(), pd.pivot_table()3. stack(), unstack() 실습을 위한 라이브러리 임포트import numpy as npimport pandas as pdimport seaborn as sns 팁 데이터 사용tips = sns.load_dataset('tips') 데이터 살펴보기tips.head()ti

dogfoot1.tistory.com

 

2024.12.07 - [빅데이터 공부] - [Pandas] 데이터 변형하기 - pivot, pivot_table

 

[Pandas] 데이터 변형하기 - pivot, pivot_table

2024.10.22 - [빅데이터 공부] - [Pandas] 데이터 변형하기 - groupby [Pandas] 데이터 변형하기 - groupby1. groupby()2. pd.pivot(), pd.pivot_table()3. stack(), unstack() 실습을 위한 라이브러리 임포트import numpy as npimport pa

dogfoot1.tistory.com

 

 

1. groupby()

2. pd.pivot(), pd.pivot_table()

3. stack(), unstack()


실습을 위한 라이브러리 임포트

import numpy as np
import pandas as pd

 

참고

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.stack.html

 

pandas.DataFrame.stack — pandas 2.2.3 documentation

Level(s) to stack from the column axis onto the index axis, defined as one index or label, or a list of indices or labels.

pandas.pydata.org

 

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.unstack.html

 

pandas.DataFrame.unstack — pandas 2.2.3 documentation

Level(s) of index to unstack, can pass level name.

pandas.pydata.org

 

특징

  • 데이터 가독성이 떨어질 때 사용한다
  • 멀티 컬럼(오른쪽으로 갈 수록 마지막 레벨)
  • 멀티 인덱스(아래로 갈 수록 마지막 레벨)
  • stack: 컬럼을 인덱스로(마지막 레벨부터 인덱스로 바뀜)
  • unstack: 인덱스를 컬럼으로(마지막 레벨부터 컬럼으로 바뀜)

데이터 프레임 생성

df = pd.DataFrame({
    "r1": ["one", "one", "two", "three"] * 6,
    "r2": ["A", "B", "C"] * 8,
    "r3": ["foo", "foo", "foo", "bar", "bar", "bar"] * 4,
    "r4": np.random.randn(24)
})

 


stack() : 컬럼을 인덱스로

pivot_table을 이용하여 멀티 컬럼으로 바꾼다

# index: r1, column: r2, r3, value: r4
st = pd.pivot_table(df, index='r1', columns=['r2', 'r3'], values='r4')
st

인덱스: r1

컬럼: r2, r3

 


컬럼의 마지막 레벨을 인덱스로 보내고 싶을 때

st.stack()

 

컬럼의 마지막 레벨인 r3(아래로 갈수록 마지막 레벨)가 인덱스의 마지막 레벨로 이동했다

인덱스: r1 -> r1, r3

컬럼: r2, r3 -> r2


컬럼의 처음 레벨을 인덱스로 보내고 싶을 때(순서대로 0, 1, ...)

st.stack(0)

 

인덱스: r1 -> r1, r2

컬럼: r2, r3 -> r3

 


unstack(): 인덱스를 컬럼으로

 

멀티 인덱스인 st.stack(0)을 가지고 다시 unstack()을 해보겠다

uns = st.stack(0)
uns

인덱스: r1, r2

컬럼: r3


인덱스의 마지막 레벨을 컬럼으로 보내고 싶을 때

uns.unstack()

인덱스의 마지막 레벨인 r2(오른쪽으로 갈수록 마지막 레벨)가 컬럼의 마지막 레벨로 이동했다

인덱스: r1, r2 -> r1

컬럼: r3 -> r3, r2

 


인덱스의 처음 레벨을 컬럼으로 보내고 싶을 때(순서대로 0, 1, ...)

uns.unstack(0)

인덱스: r1, r2 -> r2

컬럼: r3 -> r3, r1