# 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, two 가 columns 부분으로 옮겨졌으며,
unstack(level = 1)은 1번째 인덱스 값인 a, b 가 columns 부분으로 옮겨졌습니다.
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(숫자) <- 숫자를 넣을 때 동시에 두 가지 숫자가 들어갈 수는 없습니다. 또한 동시에 행과 열의 축을 선택할 수 없습니다.
'python' 카테고리의 다른 글
[python] 데이터 분석의 핵심: 날짜 전처리 방법(to_datetime) (0) | 2023.10.18 |
---|---|
[python] matplitlib, seaborn 시각화 여러개 그리기 (set_xticklabels, set_xlabel, set_title, axes) (0) | 2023.08.10 |
[python] dataframe groupby / pivot tabel (1) | 2023.03.27 |
[python] dataframe replace / rename / value_counts / unique / nunique (0) | 2023.03.25 |
[python] matplotlib - plt.bar (xlabel / ylabel / xticks / yticks / legend) (0) | 2023.03.24 |