11---
22layout : post
3- title : " Pandas의 데이터 집계( stack, melt, pivot) "
3+ title : " [학습로그] Pandas의 stack, melt"
44
55categories :
66 - learning log
77tags :
8- - [memo ]
8+ - [pandas, LearningLog, stack, melt ]
99
1010toc : true
1111toc_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+   ; 여러 개의 값을 모아(** '집'** ) 계산하여(** '계'** ) <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 컬럼을 행인덱스로
172155df_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# 국어, 수학, 영어 컬럼을 행인덱스로
180163df_pivot.stack()
@@ -185,6 +168,7 @@ df_pivot.stack()
185168#### df_stack 생성
186169- df_stack에 df_pivot.stack()을 저장한다.
187170``` python
171+ # 국어, 수학, 영어 컬럼을 행인덱스로
188172df_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
252236pd.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