Py) 기초 - Pandas(Melt)

Py) 기초 - Pandas(Melt)

파이썬 기반 데이터분석을 위하여 Pandas 라이브러리의 .melt() 메서드 사용법을 알아보자.


개요

Pandas 객체의 .melt() 메서드는 Wide Form 인 데이터프레임 객체를 Long Form 데이터프레임 객체로 그 구조를 바꿔주는 기능을 한다. 자료구조를 변경하는 과정에서 별도의 (산술)연산을 실시하지 않는다. 만약 Long Form 구조의 데이터를 Wide Form으로 역변환 하고자 한다면 .pivot() 또는 .pivot_table() 메서드를 사용해야 한다.

Wide Form: Wide Form 데이터 구조는 Fat Matrix라고도 부르며, 각 관측치는 2개 이상의 변수(열)에 배치된 형태이다. 또 Wide Form은 엑셀에서 정리하는데 많이 활용되는데 목표값에 해당하는 데이터들을 비교적 넓게 뿌려 표기하기 때문에 보다 읽기 쉽고 전반적인 값을 파악하기 쉽다. 하지만 필터링이 번거로우며 대부분의 통계 분석이나 머신러닝 알고리즘에서 Wide Form 보다 Long Form을 입력으로 하며 간혹 군집분석이나 주성분분석 같은 비지도 학습에서 Wide Form 데이터의 입력을 요구하기도 한다.
Wide Form 예시

Long Form: Long Form 데이터 구조는 Tall Matrix라고도 부르며, 각 관측치가 단일 변수(열)에 배치된 형태로, 데이터가 열보다는 행에 의존하는 구조이다. 이 구조의 데이터는 데이터 처리 및 변환에 유리하다. 그러나, 길게 늘어지는 탓에 한눈에 목표값이 들어오지 않아 직관적으로 데이터를 이해하기 어려울 수 있다. 대부분의 통계 분석이나 머신러닝 알고리즘에서 이 형태의 데이터 구조를 요구하기 때문에 이 형태가 Long Form인 것을 인지하지 못하는 경우도 많다.
Long Form 예시

실습

먼저 다음과 같이 데이터를 준비한다.

1
2
3
4
5
6
7
df = pd.DataFrame({"지점": ["A", "A", "B", "B"],
"상품": ["P1", "P2", "P1", "P2"],
"Q1": [112, 134, 156, 178],
"Q2": [212, 234, 256, 278],
"Q3": [312, 334, 356, 378],
"Q4": [412, 434, 456, 478]})
df
지점 상품 Q1 Q2 Q3 Q4
0 A P1 112 212 312 412
1 A P2 134 234 334 434
2 B P1 156 256 356 456
3 B P2 178 278 378 478

상기 데이터를 지점별 상품별 분기별 매출데이터라고 가정하자.

“A”지점의 상품별 분기별 매출을 추출한 결과는 다음과 같다.

1
2
df_sub = df.loc[df["지점"] == "A", "상품":]
df_sub
상품 Q1 Q2 Q3 Q4
0 P1 112 212 312 412
1 P2 134 234 334 434

상기 데이터에서 “상품”을 기준으로 자료구조를 변환하면 다음과 같다.

1
df_sub.melt(id_vars = "상품")
상품 variable value
0 P1 Q1 112
1 P2 Q1 134
2 P1 Q2 212
3 P2 Q2 234
4 P1 Q3 312
5 P2 Q3 334
6 P1 Q4 412
7 P2 Q4 434

기준 변수(ID variables)를 제외한 나머지 변수명은 신규 변수 “variable”의 원소가 되며, 변환 전 객체의 기준 변수의 원소와 “variable” 변수 원소와 맞물리는 값들은 “value” 변수의 원소로 들어간 것을 알 수 있다.
만약 신규로 생성된 변수 “variable”과 “value”의 변수명을 변경하고자 할 경우 .rename() 인자를 사용할 수 있겠으나 관련 기능을 .melt() 메서드에서 “var_name”과 “value_name”인자에서 제공하기 때문에 보다 편리하게 관련 변수명을 변경할 수 있다.

1
2
3
df_sub.melt(id_vars = "상품",
var_name = "분기",
value_name = "매출")
상품 분기 매출
0 P1 Q1 112
1 P2 Q1 134
2 P1 Q2 212
3 P2 Q2 234
4 P1 Q3 312
5 P2 Q3 334
6 P1 Q4 412
7 P2 Q4 434

만약 두 개 이상의 변수를 기준 변수로 지정할 경우 다음과 같이 변수명을 리스트로 감싸서 “id_vars” 인자에 할당하면 되며 그 예제는 다음과 같다.

1
df.melt(id_vars = ["지점", "상품"])
지점 상품 variable value
0 A P1 Q1 112
1 A P2 Q1 134
2 B P1 Q1 156
3 B P2 Q1 178
4 A P1 Q2 212
5 A P2 Q2 234
6 B P1 Q2 256
7 B P2 Q2 278
8 A P1 Q3 312
9 A P2 Q3 334
10 B P1 Q3 356
11 B P2 Q3 378
12 A P1 Q4 412
13 A P2 Q4 434
14 B P1 Q4 456
15 B P2 Q4 478
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×