Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python Pandas – MultiIndex에서 레벨 설정하는 방법 (set_levels 완벽 가이드)

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() 메서드를 활용하면 계층형 인덱스의 라벨을 손쉽게 교체할 수 있어, 대규모 데이터셋에서 인덱스 값을 일괄 변경해야 할 때 매우 편리합니다.