Pandas에서 MultiIndex(다중 인덱스)의 레벨을 새로 설정하려면 MultiIndex.set_levels() 메서드를 사용합니다. 이 메서드는 기존 인덱스 구조는 그대로 유지하면서 각 레벨의 값만 교체할 때 유용합니다. 먼저 필요한 라이브러리를 임포트합니다.
import pandas as pd
MultiIndex란?
MultiIndex는 pandas 객체에서 사용되는 다중 레벨(계층형) 인덱스 객체입니다. 하나의 데이터프레임이나 시리즈에서 두 개 이상의 키 조합으로 데이터를 식별할 수 있게 해주므로, 고차원 데이터를 효율적으로 다룰 수 있습니다.
먼저 MultiIndex를 만들 배열을 준비합니다.
arrays = [[1, 2, 3, 4], ['John', 'Tim', 'Jacob', 'Chris']]
from_arrays() 메서드를 사용하면 배열 목록으로부터 MultiIndex를 생성할 수 있습니다. 이때 names 매개변수를 지정하면 각 인덱스 레벨에 이름을 부여할 수 있습니다.
multiIndex = pd.MultiIndex.from_arrays(arrays, names=('ranks', 'student'))
set_levels()로 레벨 변경하기
set_levels() 메서드에 새로운 레벨 값들의 리스트를 전달하면 기존 레벨이 새 값으로 대체됩니다. 첫 번째 레벨은 문자 리스트로, 두 번째 레벨은 숫자 리스트로 변경해 보겠습니다.
print("\nSet new levels in Multi-index...\n",
multiIndex.set_levels([['p', 'q', 'r', 's'], [10, 20, 30, 40]]))
전체 예제 코드
import pandas as pd
# MultiIndex는 pandas 객체를 위한 다중 레벨(계층형) 인덱스 객체입니다
# 배열 생성
arrays = [[1, 2, 3, 4], ['John', 'Tim', 'Jacob', 'Chris']]
# names 매개변수로 각 인덱스 레벨의 이름을 지정하고
# from_arrays()로 MultiIndex를 생성합니다
multiIndex = pd.MultiIndex.from_arrays(arrays, names=('ranks', 'student'))
# MultiIndex 출력
print("The Multi-index...\n", multiIndex)
# MultiIndex의 현재 레벨 확인
print("\nThe levels in Multi-index...\n", multiIndex.levels)
# set_levels()로 새로운 레벨 설정
print("\nSet new levels in Multi-index...\n",
multiIndex.set_levels([['p', 'q', 'r', 's'], [10, 20, 30, 40]]))
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
The Multi-index...
MultiIndex([(1, 'John'),
(2, 'Tim'),
(3, 'Jacob'),
(4, 'Chris')],
names=['ranks', 'student'])
The levels in Multi-index...
[[1, 2, 3, 4], ['Chris', 'Jacob', 'John', 'Tim']]
Set new levels in Multi-index...
MultiIndex([('p', 30),
('q', 40),
('r', 20),
('s', 10)],
names=['ranks', 'student'])
결과 해석 및 주의 사항
출력 결과를 보면 원래 첫 번째 레벨의 값 [1, 2, 3, 4]가 ['p', 'q', 'r', 's']로, 두 번째 레벨의 이름들 ['John', 'Tim', 'Jacob', 'Chris']가 [10, 20, 30, 40]으로 각각 대체된 것을 확인할 수 있습니다.
set_levels()를 사용할 때는 몇 가지 주의할 점이 있습니다.
- 새로 지정하는 레벨의 개수는 반드시 기존 레벨의 개수와 일치해야 합니다. 위 예제에서는 각 레벨 모두 4개의 값을 가지고 있으므로 정상적으로 동작합니다.
- 레벨 값은 내부적으로 정렬되어 저장됩니다. 그래서 결과에서
('p', 30),('q', 40)처럼 위치가 바뀌어 보일 수 있습니다. set_levels()는 원본 MultiIndex를 수정하지 않고 새로운 MultiIndex 객체를 반환합니다. 변경 사항을 유지하려면 반환값을 변수에 할당해야 합니다.verify_integrity=True옵션을 함께 사용하면 새 레벨의 길이가 실제 인덱스 값과 맞지 않을 경우 오류를 발생시켜 데이터 무결성을 검사할 수 있습니다.
이처럼 set_levels() 메서드를 활용하면 계층형 인덱스의 라벨을 손쉽게 교체할 수 있어, 대규모 데이터셋에서 인덱스 값을 일괄 변경해야 할 때 매우 편리합니다.