Skip to content

Commit 9155bfb

Browse files
committed
아마 최종...
1 parent 7dbb306 commit 9155bfb

File tree

1 file changed

+76
-73
lines changed

1 file changed

+76
-73
lines changed

_posts/2025-02-04-학습로그1(stack,melt).md renamed to _posts/2025-02-06-학습로그1(stack,melt).md

Lines changed: 76 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,36 @@
11
---
22
layout : post
3-
title : "Pandas의 데이터 집계(stack, melt, pivot)"
3+
title : "[학습로그] Pandas의 stack, melt"
44

55
categories:
66
- learning log
77
tags:
8-
- [memo]
8+
- [pandas, LearningLog, stack, melt]
99

1010
toc: true
1111
toc_sticky: true
1212

13-
date: 2025-02-04 15:52:00 +0900
13+
date: 2025-02-06 15:52:00 +0900
1414
---
1515

16-
```
17-
[학습 로그]
18-
Pandas 데이터 집계 - Stack과 Melt의 차이점
19-
20-
헷갈리는 것
21-
- 수업시간에 배운 stack, melt, pivot이 사용되는 용도를 잘 모르겠다.
22-
- 그중에서도 stack과 melt의 차이점을 모르겠다.
23-
- 간단한 DataFrame을 생성하여 적용해보며 이해해보자.
24-
25-
집계에 사용되는 stack, melt의 두 함수를 보면, 둘 다 컬럼을 아래로 내린다는 것 같은데,
26-
정확히 이해가 되지 않았다. 그리고 컬럼에 카테고리 값이 있다면 집계를 할 수 없다는 말도
27-
와닿지 않았다.
28-
29-
주요 내용
30-
- pivot, stack, melt 이란?
31-
- DataFrame을 생성하여 stack과 melt를 적용해보며 차이점이 무엇인지 알아보자.
32-
33-
34-
```
3516
## 서론
36-
학습로그를 처음 작성하기에 앞서, 내가 수업시간에 헷갈리던 부분이 무엇인가 작성한 코랩 파일을 하나씩 보며 되짚어봤다.
37-
여러가지가 있었지만... 그 중에서도 잘 이해가 되지 않았던 stack과 melt가 눈에 들어왔다.
38-
중요한 집계 파트이기도 했고, melt가 중요하다고 말씀하신 거 같았기에 이번 기회에 확실히 개념을 잡고 넘어가면 좋을 거 같았다.
39-
stack과 melt의 용도를 헷갈리기 전에, `집계`란 무엇인지 정확히 알고 가자.
40-
#### 집계란?
41-
여러 개의 값을 모아('집') 계산하여('계') 하나의 값으로 요약하는 과정이다.
17+
 `학습로그`를 처음 작성하기에 앞서, 내가 수업시간에 헷갈리던 부분이 무엇인가 작성한 코랩 파일을 하나씩 보며 되짚어봤다.
18+
여러가지가 있었지만... 그 중에서도 잘 이해가 되지 않았던 `stack``melt`가 눈에 들어왔다.
19+
중요한 집계 파트이기도 했고, melt가 중요하다고 말씀하신 거 같았기에, 이번 기회에 확실히 개념을 잡고 넘어가면 좋을 거 같았다.
20+
`stack``melt`의 용도를 헷갈리기 전에, `집계`란 무엇인지 정확히 알고 가자.
21+
22+
## 본론
23+
#### **집계란?**
24+
&nbsp;여러 개의 값을 모아(**'집'**) 계산하여(**'계'**) <u>하나의 값으로 요약</u>하는 과정이다.
4225
대표적인 집계 함수로는 mean(), min(), max() 등이 있다.
4326

44-
이때, 집계의 기준이 되는 데이터(집합)는 반드시 행(row) 단위여야 한다.
45-
예를 들어, 데이터프레임의 컬럼이 ['이름', '국어', '수학', '영어']로 구성되어 있을 때,
46-
'이름'이라는 컬럼 아래 존재하는 행 단위의 각 학생의 평균 점수를 계산하는 것은 가능하지만,
47-
'과목'이라는 컬럼명이 존재하지 않는 상태에서는 '국어', '수학', '영어' 별로 집계를 수행할 수 없다.
27+
&nbsp; 이때, 집계의 기준이 되는 데이터(집합)는 반드시 `행(row) 단위`여야 한다.
28+
예를 들어, 데이터프레임의 컬럼이 `['이름', '국어', '수학', '영어']`로 구성되어 있을 때,
29+
`'이름'`이라는 컬럼 아래 존재하는 행 단위의 각 학생의 평균 점수를 계산하는 것은 가능하지만,
30+
`'과목'`이라는 컬럼명이 존재하지 않는 상태에서는 <u>'국어', '수학', '영어' 별로 집계를 수행할 수 없다.</u>
4831

4932
이제 집계에 대해 이해했다.
50-
이러한 집계를 수행해주는 pandas의 함수들 중, stack과 melt의 차이점을 명확하게 이해해보자.
33+
이러한 집계를 수행해주는 pandas의 함수들 중, `stack``melt` 차이점을 명확하게 이해해보자.
5134

5235
***
5336

@@ -83,13 +66,13 @@ Index(['이름', '반', '국어', '수학', '영어'], dtype='object')
8366

8467
***
8568

86-
해당 df를 사용하여 stack, melt에 대해 자세히 이해해보자.
87-
stack과 melt를 이해하기에 앞서, 보통의 DataFrame 컬럼은 멀티인덱스를 갖지
88-
않지 않는다. 따라서 pivot_table을 통해 집계를 시행하여 컬럼에 멀티인덱스를 만든 뒤에, stack과 melt를 적용해보자.
69+
해당 df를 사용하여 `stack`, `melt` 대해 자세히 이해해보자.
70+
`stack``melt` 이해하기에 앞서, 보통의 DataFrame 컬럼은 `멀티인덱스` 갖지
71+
않지 않는다. 따라서 `pivot_table` 통해 집계를 시행하여 컬럼에 `멀티인덱스` 만든 뒤에, `stack``melt` 적용해보자.
8972

9073
## pivot_table
91-
- 컬럼에 있는 index, columns, values, aggfunc을 지정해서 집계가 가능하다.
92-
- 매개변수에는 컬럼만을 지정할 수 있다.
74+
- 컬럼에 있는 것들을 직접 index, columns, values,으로 지정하고, 원하는 집계 방법을 aggfunc에 적는다.
75+
- 매개변수에는 **컬럼만을 지정** 수 있다.
9376

9477
#### pivot_table 생성 형식
9578
```python
@@ -115,8 +98,8 @@ df_pivot
11598
`[출력]`
11699
![](/images/../images/2025-02-05-22-11-30.png)
117100

118-
- columns에 MultiIndex가 생성되었다.
119-
- columns의 MultiIndex level은 다음과 같다
101+
- columns에 `MultiIndex` 생성되었다.
102+
- columns의 `MultiIndex level` 다음과 같다
120103
- 표와 가까울수록 `하위 레벨`, 멀 수록 `상위 레벨`이다.
121104
![](/images/../images/2025-02-05-23-05-38.png)
122105

@@ -150,13 +133,13 @@ MultiIndex([('mean', '국어'),
150133
스택의 특징은 다음과 같다.
151134
## stack
152135

153-
- 컬럼의 멀티인덱스를 레벨 단위로 행 인덱스로 내린다.
154-
- 행 인덱스느 MultiIndex가 됨
155-
- 표가 가로로 너무 길 경우, 세로로 길게 만들 수 있음
156-
- 집계를 하기 위한 기능은 아니다!
157-
- 멀티인덱스는 집계가 불가능하다.
158-
- 결과적으로, 기존 표의 구조를 바꿔서 보기 쉽게 만든다.
136+
- `컬럼 레벨` 단위로 지정해서 `행 인덱스`로 내린다.
137+
- 행 인덱스는 `MultiIndex`가 됨
138+
- 표가 가로로 너무 길 경우(wide format), 세로로 길게 만들 수 있음(long format)
139+
- **집계를 하기 위한 기능은 아니다!**
140+
- `멀티인덱스`**집계가 불가능**하다.
159141
- stack() 안에 컬럼 레벨을 지정하지 않으면 가장 하위레벨이 자동으로 선택 된다.
142+
- 결과적으로, 기존 표의 구조를 바꿔서 보기 쉽게 만든다.
160143

161144
#### stack() 사용 형식
162145

@@ -166,15 +149,15 @@ df.stack(컬럼레벨)
166149
```
167150
#### df_pivot에 stack 적용 후 결과 확인
168151

169-
##### 상위 레벨 선택 (level 0)
152+
- `상위 레벨` 선택 (**level 0**)
170153
```python
171154
# mean, min, max 컬럼을 행인덱스로
172155
df_pivot.stack(0)
173156
```
174157
`[출력]`
175158
![](/images/../images/2025-02-05-22-45-30.png)
176159

177-
#### 하위 레벨 선택 (level 1)
160+
- `하위 레벨` 선택 (**level 1**)
178161
```python
179162
# 국어, 수학, 영어 컬럼을 행인덱스로
180163
df_pivot.stack()
@@ -185,6 +168,7 @@ df_pivot.stack()
185168
#### df_stack 생성
186169
- df_stack에 df_pivot.stack()을 저장한다.
187170
```python
171+
# 국어, 수학, 영어 컬럼을 행인덱스로
188172
df_stack = df_pivot.stack()
189173
```
190174
#### index와 columns를 확인해보자
@@ -210,9 +194,9 @@ Index(['mean', 'min', 'max'], dtype='object')
210194

211195
***
212196

213-
또한 stack의 반대 개념인 unstack이 존재하는데, stack의 반대 개념이므로 가볍게 보고 넘어가자.
197+
또한 stack의 반대 개념인 `unstack` 존재하는데, stack의 반대 개념이므로 가볍게 보고 넘어가자.
214198
### unstack()
215-
- 행의 멀티인덱스를 컬럼으로 올린다.
199+
- 행의 `멀티인덱스` 컬럼으로 올린다.
216200
- stack()의 반대개념이다.
217201
- stack()을 실행한 DataFrame을 unstack하면 처음 형태가 된다.
218202

@@ -226,27 +210,27 @@ df_stack.unstack()
226210
```
227211
`[출력]`
228212
![](/images/../images/2025-02-05-23-18-42.png)
229-
- 행 인덱스의 가장 하위레벨이었던 '국어', '수학', '영어'가 컬럼인덱스의 가장 하위레벨이 되었다.
213+
- 행 인덱스의 가장 하위레벨이었던 `'국어', '수학', '영어'`가 컬럼인덱스의 가장 하위레벨이 되었다.
230214

231215
***
232216

233-
위의 과정을 통해, stack은 컬럼레벨을 행의 인덱스로 내린다는 것을 알게 되었다. 또한 stack을 통해 컬럼을 행 인덱스로
234-
내리면, 인덱스가 합쳐져 멀티인덱스가 됨을 알았다. 멀티인덱스는 집계의 '집', 즉 그룹을 모으는 과정에 사용할 수 없다. 그저 데이터를 구분하는 역할에 그친다.
217+
위의 과정을 통해, `stack`**컬럼레벨을 행의 인덱스** 만드는 것을 알게 되었다. 또한 stack을 통해 컬럼을 행 인덱스로
218+
내리면, 인덱스가 합쳐져 `멀티인덱스` 됨을 알았다.
235219

236-
컬럼이 멀티인덱스인 경우 가로로 표가 길어져 가독성이 떨어지기 때문에 stack을 통해 표의 구조를 보기 좋게 바꾼다.
237-
따라서 stack은 표의 형태를 보기 좋게 바꾸는 데에 주로 사용된다. 멀티인덱스는 집계에서 사용하지 못 하기 때문에, stack은 그저
238-
가로로 긴 표를 세로로 길게 만들어주는, 표를 보기 좋게 바꿔주는 함수라고 생각할 수 있다.
220+
컬럼이 `멀티인덱스` 경우 가로로 표가 길어져 가독성이 떨어지기 때문에 `stack` 통해 표의 구조를 보기 좋게 바꿀 수 있다.
221+
`멀티인덱스``집계`**'집'**, 즉 그룹을 모으는 과정에 <u>사용할 수 없다</u>. 그저 데이터를 구분하는 역할에 그친다.
222+
따라서 `stack`의 사용 목적은 `집계`가 아닌, 표의 형태를 보기 좋게 바꾸는 데에 주로 사용된다.
239223

240-
이제 melt를 이해하고, stack과 melt의 차이점을 이해해보자.
224+
이제 `melt` 이해하고, `stack``melt` 차이점을 이해해보자.
241225

242226
## melt
243227

244228
- 기준을 잡은 컬럼들을 제외하고, 남은 컬럼들을 하나의 컬럼으로 녹임.
229+
- 따라서 카테고리가 컬럼에 있다면, 해당 카테고리에 대해 집계를 할 수 있게 해준다.
245230

246-
특징을 살펴보면 stack과의 차이를 볼 수 있다.
247-
- stack은 컬럼을 행인덱스로 만드는 것이고, melt는 컬럼들을 기준에 맞춰 하나의 컬럼으로 녹이는 것이다.
248-
그러나 크게 와닿지 않기 때문에 직접 사용해서 비교해보자.
249-
#### melt() 사용법
231+
특징을 살펴보면 `stack`과의 차이를 볼 수 있다. `stack`**컬럼을 행인덱스로 만드는 것**이고, `melt`는 컬럼들을 기준을 두고 **하나의 컬럼으로 녹이는 것**이다.
232+
뭔가 알쏭달쏭 하지만, 아직 헷갈리기 때문에 직접 사용해서 비교해보자.
233+
#### melt() 사용 형식
250234

251235
```python
252236
pd.melt(
@@ -269,11 +253,28 @@ df_melt
269253
`[출력]`
270254
![](/images/../images/2025-02-05-23-52-25.png)
271255

272-
- '국어', '수학', '영어'가 '과목'이라는 컬럼 하나로 녹았다.
273-
- '국어', '수학', '영어'의 값은 '점수' 컬럼에 녹았다.
274-
melt를 사용하기 전의 df는 과목(국어, 수학, 영어)이 컬럼에 각각 존재했기 때문에 '과목'별로 집계가 불가능 했는데,
275-
melt를 사용하여 과목들을 하나의 컬럼으로 녹여냈으므로, 과목 별 집계가 가능하다!
256+
#### df_melt의 index와 columns을 확인하자
276257

258+
```python
259+
df_melt.index
260+
```
261+
`[출력]`
262+
RangeIndex(start=0, stop=12, step=1)
263+
264+
```python
265+
df_melt.columns
266+
```
267+
`[출력]`
268+
Index(['이름', '반', '과목', '점수'], dtype='object')
269+
270+
- `멀티인덱스`**생성되지 않았다.**
271+
- `'국어', '수학', '영어'``'과목'`이라는 카테고리로 묶여 컬럼 하나로 녹았다.
272+
- `'국어', '수학', '영어'`의 값은 `'점수'` 컬럼에 녹았다.
273+
274+
`melt`를 사용하기 전의 df는 과목(국어, 수학, 영어)이 컬럼에 각각 존재했기 때문에 '과목'별로 집계가 불가능 했는데,
275+
`melt`를 사용하여 <u>과목들을 하나의 컬럼으로 녹여냈으므로</u>, **과목 별 집계가 가능**하다!
276+
277+
- 그렇다면 group by를 통해 과목 별로 집계를 수행해보자.
277278
#### 과목별 점수 평균 집계
278279
```python
279280
df_t = df_melt.groupby("과목").mean(numeric_only=True)
@@ -283,27 +284,29 @@ melt를 사용하여 과목들을 하나의 컬럼으로 녹여냈으므로, 과
283284
![](/images/../images/2025-02-05-23-55-09.png)
284285

285286

286-
결과적으로 melt는 카테고리 컬럼들을 하나로 합쳐서 해당 카테고리에 대해 집계가 가능하도록
287-
표를 바꿔주는 함수이다. 그리고 stack은 컬럼 레벨을 행인덱스로 바꿔서 wide format인 표를
288-
long format으로 전환시켜 보기 좋게 해주는 함수이다. 이때, 행 인덱스가 멀티인덱스가 되기 때문에,
289-
컬럼 카테고리로 집계를 하기 위해 stack을 사용하는 것 보단 melt를 사용하는 게 적절하다.
287+
결과적으로 `melt` 카테고리 <u>컬럼들을 하나로 합쳐서</u> 해당 카테고리에 대해 **집계가 가능하도록**
288+
표를 바꿔주는 함수이다. 그리고 `stack`은 <u>컬럼 레벨을 행인덱스</u>로 바꿔서 **wide format** 표를
289+
**long format**으로 전환시켜 보기 좋게 해주는 함수이다. 이때, 행 인덱스가 `멀티인덱스` 되기 때문에,
290+
컬럼 카테고리로 집계를 하기 위해서는 `melt` 사용하는 게 적절하다.
290291

291292
| 구분 | stack | melt |
292293
|----------|----------------|----------------|
293294
| 정의 | 컬럼을 행 인덱스로 내리는 변환 | 컬럼을 녹여서 하나의 컬럼으로 만드는 변환 |
294-
| 작동 방식 | 컬럼 레벨을 하나의 인덱스로 변환 (멀티인덱스 생성 가능) | 지정한 컬럼을 기준으로 나머지 컬럼들을 두 개의 컬럼 (`variable`, `value`)으로 변환 |
295+
| 작동 방식 | 컬럼 레벨을 하나의 인덱스로 변환 (멀티인덱스 생성) | 지정한 컬럼을 기준으로 나머지 컬럼들을 두 개의 컬럼 (`variable`, `value`)으로 변환 |
295296
| 주요 특징 | 컬럼이 행 인덱스로 이동하며 데이터 형태가 길어짐 | 여러 컬럼을 하나의 컬럼으로 합쳐서 긴 형태로 변환 |
296297
| 인덱스 변화 | 멀티인덱스 생성 가능 | 기존 인덱스 유지 |
297298
| 사용 예시 | `df.stack()` | `pd.melt(df, id_vars=["기준 컬럼"])` |
298299
| 주로 사용하는 상황 | 멀티인덱스가 필요할 때 | 데이터 시각화를 위해 긴 형태(long format)로 변환할 때 |
299300

300301
## 마무리
301-
학습로그를 태어나서 처음 작성해 보았는데, 내가 모르는 부분을 시간내서 조사하고,
302+
&nbsp; 학습로그를 태어나서 처음 작성해 보았는데, 내가 모르는 부분을 시간내서 조사하고,
302303
이해하는 게 생각보다 재밌어서 좋았다. 그러나 조사하고 공부한 내용들을 머릿속에서 꺼내서
303304
예쁘게 작성하는 게 어려웠다. 아직 요령이 없어서 그렇다고 생각한다. 앞으로 꾸준히 작성해서
304305
멋진 블로그를 만들 수 있도록 노력해야겠다.
305306

306307
### 링크
307-
- 참고 블로그
308-
308+
- 참고 링크
309+
- https://velog.io/@xindex/python-StackUnstack-Pivot-Melt
310+
- https://velog.io/@midoi327/Pandas-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B3%80%ED%99%98-T-pivot-melt-stack-unstack-crosstab-sort-duplicated
311+
- https://www.inflearn.com/community/questions/453877/stack%EA%B3%BC-melt%EC%9D%98-%EC%B0%A8%EC%9D%B4?focusComment=170541
309312

0 commit comments

Comments
 (0)