Pandas에서 MultiIndex의 레벨 순서를 레벨 이름 기준으로 재정렬하려면 reorder_levels() 메서드를 사용합니다. 원하는 순서대로 레벨 이름을 리스트 형태로 전달하면 됩니다. 레벨 번호 대신 이름을 사용하기 때문에, 레벨이 많은 복잡한 계층형 인덱스에서도 코드의 의도를 훨씬 명확하게 표현할 수 있습니다.
1. MultiIndex란 무엇인가?
MultiIndex는 pandas 객체에서 사용되는 다중 레벨(계층형) 인덱스 객체입니다. 하나의 축(axis)에 여러 개의 인덱스 레벨을 결합하여 데이터를 더 세밀하게 구조화하고 접근할 수 있도록 도와줍니다.
먼저 필요한 라이브러리를 임포트합니다.
import pandas as pd
예제에 사용할 배열을 생성합니다.
arrays = [[2, 4, 3, 1], ['Peter', 'Chris', 'Andy', 'Jacob'], [50, 30, 40, 70]]
names 매개변수는 각 인덱스 레벨에 이름을 부여하며, from_arrays() 메서드를 사용하면 배열로부터 MultiIndex를 생성할 수 있습니다.
multiIndex = pd.MultiIndex.from_arrays(arrays, names=('rank', 'student', 'points'))
여기서는 'rank'(순위), 'student'(학생), 'points'(점수)라는 세 개의 레벨 이름을 지정했습니다.
2. 레벨 이름으로 레벨 순서 재정렬하기
order 매개변수에 원하는 순서대로 레벨 이름을 전달하면 MultiIndex의 레벨이 그 순서대로 재배열됩니다. 아래 예제에서는 기존의 ('rank', 'student', 'points') 순서를 ('student', 'rank', 'points')로 변경합니다.
print("\nReorder levels in MultiIndex using level name...\n",
multiIndex.reorder_levels(order=['student', 'rank', 'points']))
3. 전체 예제 코드
import pandas as pd
# MultiIndex는 pandas 객체를 위한 다중 레벨(계층형) 인덱스 객체입니다.
# 배열 생성
arrays = [[2, 4, 3, 1], ['Peter', 'Chris', 'Andy', 'Jacob'], [50, 30, 40, 70]]
# "names" 매개변수는 각 인덱스 레벨의 이름을 설정합니다.
# from_arrays()를 사용해 MultiIndex를 생성합니다.
multiIndex = pd.MultiIndex.from_arrays(arrays, names=('rank', 'student', 'points'))
# MultiIndex 출력
print("The MultiIndex...\n", multiIndex)
# MultiIndex에 포함된 레벨 확인
print("\nThe levels in MultiIndex...\n", multiIndex.levels)
# swaplevel()로 두 레벨의 위치를 교환
# 첫 번째 매개변수: 교환할 첫 번째 레벨
# 두 번째 매개변수: 교환할 두 번째 레벨
print("\nSwap levels in MultiIndex...\n", multiIndex.swaplevel(0, 2))
# reorder_levels()로 레벨 순서 재정렬
# "order" 매개변수에 레벨 이름 목록을 전달해 새로운 순서를 지정합니다.
print("\nReorder levels in MultiIndex using level name...\n",
multiIndex.reorder_levels(order=['student', 'rank', 'points']))
4. 실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
The MultiIndex...
MultiIndex([(2, 'Peter', 50),
(4, 'Chris', 30),
(3, 'Andy', 40),
(1, 'Jacob', 70)],
names=['rank', 'student', 'points'])
The levels in MultiIndex...
[[1, 2, 3, 4], ['Andy', 'Chris', 'Jacob', 'Peter'], [30, 40, 50, 70]]
Swap levels in MultiIndex...
MultiIndex([('Peter', 2, 50),
('Chris', 4, 30),
( 'Andy', 3, 40),
('Jacob', 1, 70)],
names=['student', 'rank', 'points'])
Reorder levels in MultiIndex using level name...
MultiIndex([('Peter', 2, 50),
('Chris', 4, 30),
( 'Andy', 3, 40),
('Jacob', 1, 70)],
names=['student', 'rank', 'points'])
5. 정리
- swaplevel() : 두 개의 레벨 위치만 간단히 맞바꿀 때 유용합니다.
- reorder_levels() : 세 개 이상의 레벨을 한 번에 원하는 순서로 재배열할 수 있으며, 레벨 번호 대신 레벨 이름을 지정할 수도 있습니다.
레벨 이름을 활용하면 인덱스 구조가 복잡해져도 어떤 레벨을 어떤 위치로 옮기는지 코드만 보고도 명확하게 파악할 수 있습니다. 따라서 실무에서 계층형 데이터를 다룰 때 코드의 가독성과 유지보수성이 크게 향상됩니다.