python

[python] pandas stack / unstack

독립성이 강한 ISFP 2023. 3. 27. 19:48
728x90
반응형

# stack / unstack의 형태

dataframe.stack(level = -1, dropna = True)

dataframe.stack(level = -1, dropna = True)

 

level : default 값은 -1입니다. 하나의 index 혹은 columns를 쌓을 수준입니다. (한 번에 여러 level을 선택할 수 없습니다.)

dropna : default 값은 True 입니다. False로 설정할 경우, nan 값이 출력됩니다.


- stack : 칼럼인덱스로!

파라미터

  • level: stack을 수행할 인덱스 레벨을 지정합니다. 여러 개의 레벨을 지정할 수 있으며, 이 경우 데이터프레임이 멀테인덱스를 가지게 됩니다. 기본값은 -1로, 마지막 인덱스 레벨을 사용합니다.
  • dropna: 스택을 수행한 결과에서 결측값을 제거할지 여부를 지정합니다. 기본값은 True로, 결측값을 제거합니다.
    • dropna=True 옵션을 주면 결측값이 있는 행(row)는 스택(Stack)의 대상에서 제외됩니다.

 

- unstack : 인덱스칼럼으로!

파라미터 

  • level: unstack을 수행할 인덱스 레벨을 지정합니다. 여러 개의 레벨을 지정할 수 있으며, 이 경우 데이터프레임이 멀테인덱스를 가지게 됩니다. 기본값은 -1로, 마지막 인덱스 레벨을 사용합니다.
  • fill_value: unstack을 수행한 결과에서 결측값을 채울 값을 지정합니다. 기본값은 None으로, 결측값을 그대로 둡니다.

 

1. unstack

1.1 멀티인덱스를 갖는 s1 데이터 생성

index = pd.MultiIndex.from_tuples([('one', 'a'), ('one', 'b'),
                                   ('two', 'a'), ('two', 'b')])
s1 = pd.Series(np.arange(1.0, 5.0), index=index)

인덱스를 하나가 아닌 두 개를 갖는 s1 데이터셋을 생성해 보았습니다.

s1 데이터의 인덱스는 [('one', 'a'), ('one', 'b'), ('two', 'a'), ('two', 'b')]입니다.

1.2 s1.unstack(level = 0) / s1.unstack(level = 1)

  • 데이터프레임.unstack(몇 번째 인덱스? (default = 마지막인덱스))

먼저 s1 데이터에 unstack 함수를 적용해 보면 위와 같은 결과가 출력됩니다.

unstack(level = 0)0번째 인덱스 값one, twocolumns 부분으로 옮겨졌으며,

unstack(level = 1)1번째 인덱스 값a, bcolumns 부분으로 옮겨졌습니다.

1.3 멀티인덱스와 칼럼을 갖는 d1 데이터프레임 생성

index = pd.MultiIndex.from_tuples([('one', 'a'), ('one', 'b'),
                                   ('two', 'a'), ('two', 'b')])
d1 = pd.Series(np.arange(1.0, 5.0), index=index)
print('d1 원본 데이터')
d1 = d1.to_frame()
d1[1]=[4,3,2,1]
d1

이번엔 [('one', 'a'), ('one', 'b'), ('two', 'a'), ('two', 'b')] 멀티인덱스이면서 0, 1의 칼럼을 갖는 d1 데이터프레임을 생성해 보았습니다.

 

1.4 loc을 이용하여 특정 값 추출

d1.loc['one','a']

'one' 이면서 'a' 인덱스를 갖는 1.0, 4.0 가 출력되었습니다.

1.5 d1.unstack(0) / d1.unstack(1)

s1.unstack과 같은 맥락으로 d1.unstack(0) 은 0번째 인덱스 값인 one, two 가 columns 부분으로 옮겨졌으며,

d1.unstack(1)은 1번째 인덱스 값인 a, b 가 columns 부분으로 옮겨졌습니다.

 

1.6 특정 값 추출

d1.unstack(0)[0, 'one']

d1.unstack(0)의 결과에서 '0', 'one'의 칼럼을 갖는 1과 2를 출력했습니다. 

d1.unstack(0)[0, 'one']['a']

> 1.0

이처럼 [] 를 두 번 사용해서 행과 열을 추출하는 방법도 있습니다.

2. stack 

e2.columns

e2 데이터셋을 가지고 stack 함수를 실습해볼 건데요. e2의 칼럼에는 어떤 값이 있는지 출력해 보니 0, 1 그리고 one, two 가 존재하네요.

√

e1.stack(0) 은 0번째 인덱스 값인 0, 1 가 index 부분으로 옮겨졌으며,

e1.stack(1)은 1번째 인덱스 값인 one, two 가 index 부분으로 옮겨졌습니다.

 

stack은 unstack과 반대이므로 unstack을 이해하면 stack도 어렵지 않게 이해가 될 것 같네요.

 

3. unstack 실습

g = df_last.groupby(["연도", "지역명"])["평당분양가격"].mean()
g

g 데이터는 연도와 지역별 평당분양가격의 평균입니다. 

 

### 1
g.unstack(0).head()

### 2
g.unstack().transpose().head()

1번과 2번 모두 아래와 같은 결과가 나오겠네요. 

이처럼 unstack과 stack은 transpose 함수와 같이 자주 사용되기도 합니다.

 

*stack(숫자) <- 숫자를 넣을 때 동시에 두 가지 숫자가 들어갈 수는 없습니다. 또한 동시에 행과 열의 축을 선택할 수 없습니다.

728x90
반응형