Pandas DataFrame에서 다중 레벨(multi-level) 열을 쌓으려면 stack() 메서드를 사용합니다. stack()은 열(column)을 행(row) 아래쪽으로 회전시켜 와이드(wide) 형식의 데이터를 롱(long) 형식으로 변환해 주는 유용한 기능입니다.
1. 라이브러리 불러오기
먼저 필요한 라이브러리를 임포트합니다.
import pandas as pd
2. 다중 레벨 열 생성하기
pd.MultiIndex.from_tuples()를 사용해 튜플 목록으로 다중 레벨 열을 만듭니다. 여기서는 최상위 레벨이 'Maths', 하위 레벨이 세부 과목인 구조를 구성했습니다.
items = pd.MultiIndex.from_tuples([
('Maths', 'Mental Maths'),
('Maths', 'Discrete Mathematics'),
('Maths', 'Applied Mathematics')
])
3. DataFrame 생성하기
이제 앞에서 정의한 다중 레벨 열을 columns 인자에 지정하여 DataFrame을 생성합니다. 행 인덱스는 학생 이름으로 설정합니다.
dataFrame = pd.DataFrame(
[[67, 86, 78],
[56, 92, 97],
[92, 95, 91]],
index=['John', 'Tom', 'Henry'],
columns=items
)
4. 다중 레벨 열 쌓기
stack() 메서드를 호출하면 가장 안쪽 열 레벨이 가장 안쪽 행 레벨로 피벗되어, 학생별 과목 점수가 세로로 길게 재구성됩니다.
dataFrame.stack()
전체 예제 코드
다음은 지금까지의 과정을 모두 포함한 완전한 코드입니다.
import pandas as pd
# 다중 레벨 열 생성
items = pd.MultiIndex.from_tuples([
('Maths', 'Mental Maths'),
('Maths', 'Discrete Mathematics'),
('Maths', 'Applied Mathematics')
])
# DataFrame 생성
dataFrame = pd.DataFrame(
[[67, 86, 78],
[56, 92, 97],
[92, 95, 91]],
index=['John', 'Tom', 'Henry'],
columns=items
)
# DataFrame 출력
print("DataFrame...\n", dataFrame)
# 다중 레벨 열 쌓기
print("\nStacking...\n", dataFrame.stack())
출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
DataFrame...
Maths
Mental Maths Discrete Mathematics Applied Mathematics
John 67 86 78
Tom 56 92 97
Henry 92 95 91
Stacking...
Maths
John Applied Mathematics 78
Discrete Mathematics 86
Mental Maths 67
Tom Applied Mathematics 97
Discrete Mathematics 92
Mental Maths 56
Henry Applied Mathematics 91
Discrete Mathematics 95
Mental Maths 92
정리: stack() 메서드의 동작 원리
stack()은 DataFrame의 마지막(가장 안쪽) 열 레벨을 행 인덱스의 하위 레벨로 이동시킵니다. 그 결과 각 학생 이름 아래에 세부 과목이 새로운 인덱스로 배치되고, 데이터가 세로 방향으로 길어진 멀티 인덱스 Series가 반환됩니다. 반대로 쌓여 있는 구조를 다시 넓은 형태로 펼치고 싶다면 unstack() 메서드를 사용하면 됩니다. 두 메서드는 서로 역연산 관계에 있으므로 함께 익혀두면 데이터 재구성 작업이 한결 수월해집니다.