본문 바로가기
프로그래밍/파이썬(Python)

[Pandas] MultiIndex

by comflex 2025. 4. 16.
728x90
반응형

multi index

Pandas는 강력한 데이터 분석 도구로 잘 알려져 있으며, 그 중에서도 MultiIndex복잡한 데이터 구조를 깔끔하게 표현할 수 있는 기능입니다.
이 포스트에서는 Pandas MultiIndex의 개념부터 생성, 활용, 주의사항까지 한 번에 정리해드립니다. 데이터 분석에 있어 꼭 알아야 할 핵심 기능이에요!


1. MultiIndex란?

MultiIndex는 Pandas에서 2단계 이상의 인덱스를 갖는 계층형 인덱스 구조입니다.
엑셀에서 피벗 테이블을 만들면 생기는 다단계 열 구조를 떠올리면 이해가 쉬워요.

예를 들어, 아래처럼 회사명과 연도를 인덱스로 가진 데이터를 생각해볼 수 있습니다.

Company Year Sales
A 2020 100
A 2021 110
B 2020 200
B 2021 210

이 데이터를 MultiIndex로 바꾸면 다음과 같이 표현됩니다:

Company  Year
A        2020    100
         2021    110
B        2020    200
         2021    210

2. MultiIndex 생성 방법

(1) set_index() 사용

import pandas as pd

df = pd.DataFrame({
    'Company': ['A', 'A', 'B', 'B'],
    'Year': [2020, 2021, 2020, 2021],
    'Sales': [100, 110, 200, 210]
})

df_multi = df.set_index(['Company', 'Year'])
print(df_multi)

(2) MultiIndex.from_tuples()

index = pd.MultiIndex.from_tuples(
    [('A', 2020), ('A', 2021), ('B', 2020), ('B', 2021)],
    names=['Company', 'Year']
)
values = [100, 110, 200, 210]
df = pd.DataFrame({'Sales': values}, index=index)
print(df)

반응형
728x90

3. 인덱싱과 슬라이싱

MultiIndex를 사용하면 다단계로 인덱싱할 수 있습니다.

# 특정 회사만 선택
print(df.loc['A'])

# 다단계 인덱싱
print(df.loc[('A', 2021)])

또는 pd.IndexSlice를 활용하면 범위 선택도 가능합니다:

idx = pd.IndexSlice
print(df.loc[idx[:, 2020], :])  # 2020년 데이터 전체

4. reset_index로 일반 인덱스로 되돌리기

MultiIndex를 원래처럼 일반 인덱스로 되돌릴 수 있습니다.

df_reset = df.reset_index()
print(df_reset)

5. groupby와 MultiIndex

groupby() 연산 결과도 MultiIndex를 가진 결과가 자주 등장합니다.

df = pd.DataFrame({
    'Region': ['서울', '서울', '부산', '부산'],
    'Year': [2020, 2021, 2020, 2021],
    'Sales': [100, 110, 200, 210]
})

grouped = df.groupby(['Region', 'Year']).sum()
print(grouped)

이 결과는 자동으로 MultiIndex가 적용된 상태가 됩니다.


6. MultiIndex에서 unstack과 stack

unstack()stack()은 MultiIndex를 활용한 대표적인 변환 방법입니다.

# Year를 열로 이동
print(grouped.unstack())

# 다시 행으로 이동
print(grouped.unstack().stack())

7. MultiIndex의 활용 팁

상황 MultiIndex 장점
피벗 테이블처럼 다단계 그룹화 계층형 구조로 정돈
시계열 데이터 관리 년/월/일 구조로 나눠서 조회 용이
그룹 통계 계산 groupby().agg() 결과에 자동 MultiIndex 생성

8. MultiIndex 정렬 및 이름 변경

# 정렬
df_sorted = df.sort_index(level='Year')

# 레벨 이름 변경
df.index.names = ['회사명', '연도']

레벨별 정렬이나 이름 조정도 쉽게 가능합니다.


9. MultiIndex 주의할 점

  • 인덱싱이 직관적이지 않을 수 있음 → IndexSlice를 적절히 활용
  • reset_index() 후 정렬이 엉킬 수 있으므로 주의
  • 너무 많은 레벨이 있는 경우 가독성이 떨어질 수 있음

10. 결론

Pandas MultiIndex는 복잡한 데이터를 보다 구조적이고 명확하게 표현할 수 있는 매우 강력한 기능입니다.
처음에는 생소할 수 있지만, 실무에서 groupby, pivot, stack/unstack과 함께 자주 사용되므로 꼭 익혀야 할 필수 기능입니다.

728x90
반응형