개요
Pandas에서 index.get_indexer_non_unique() 메서드를 사용하면 값이 중복(고유하지 않음)되어 있는 Index 객체에 대해서도 새로운 인덱스에 대한 인덱서(indexer)와 마스크(mask)를 계산할 수 있습니다.
일반적인 get_indexer() 메서드는 고유한(unique) 값만 다룰 수 있지만, get_indexer_non_unique()는 중복된 값을 가진 인덱스에서도 원하는 위치를 정확하게 찾아줍니다. 또한, 찾으려는 값이 인덱스에 존재하지 않으면 해당 위치를 -1로 표시해 주기 때문에 누락된 값도 쉽게 확인할 수 있습니다.
라이브러리 임포트
먼저 필요한 라이브러리를 임포트합니다.
import pandas as pd
중복 값을 포함하는 Pandas 인덱스 생성
중복 값(40과 60이 여러 번 등장)을 포함하는 Pandas 인덱스를 생성합니다.
index = pd.Index([10, 20, 30, 40, 40, 50, 60, 60, 60, 70])
생성된 Pandas 인덱스를 출력합니다.
print("Pandas Index...\n", index)인덱서와 마스크 계산하기
이제 get_indexer_non_unique()를 호출하여 인덱서와 마스크를 계산합니다. 찾으려는 값 중 인덱스에 없는 값(90, 100)은 -1로 표시됩니다. 동시에 중복된 값들(40, 60)에 해당하는 모든 위치도 함께 반환됩니다.
print("\nGet the indexes...\n", index.get_indexer_non_unique([30, 40, 90, 100, 50, 60]))전체 예제 코드
다음은 위 내용을 모두 포함한 전체 코드입니다.
import pandas as pd
# 중복 값을 포함하는 Pandas 인덱스 생성
index = pd.Index([10, 20, 30, 40, 40, 50, 60, 60, 60, 70])
# Pandas 인덱스 출력
print("Pandas Index...\n", index)
# 인덱스의 요소 개수 반환
print("\nNumber of elements in the index...\n", index.size)
# 인덱서와 마스크 계산
# 인덱스에 없는 값은 -1로 표시됨
# 중복 값을 가진 Index 객체의 값도 함께 계산됨
print("\nGet the indexes...\n", index.get_indexer_non_unique([30, 40, 90, 100, 50, 60]))실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Pandas Index... Int64Index([10, 20, 30, 40, 40, 50, 60, 60, 60, 70], dtype='int64') Number of elements in the index... 10 Get the indexes... (array([ 2, 3, 4, -1, -1, 5, 6, 7, 8], dtype=int64), array([2, 3], dtype=int64))
결과 해석
출력 결과는 두 개의 배열로 구성됩니다.
첫 번째 배열 (인덱서): 찾으려는 각 값([30, 40, 90, 100, 50, 60])이 원본 인덱스에서 위치한 좌표입니다.
• 30 → 위치 2
• 40 → 위치 3과 4 (중복되어 두 개)
• 90 → -1 (존재하지 않음)
• 100 → -1 (존재하지 않음)
• 50 → 위치 5
• 60 → 위치 6, 7, 8 (중복되어 세 개)
두 번째 배열 (마스크): 어떤 검색 값이 중복으로 매칭되었는지 나타냅니다. 여기서 [2, 3]은 첫 번째 입력 배열 기준으로 인덱스 2(값 90)와 인덱스 3(값 100)에 해당하는 검색이 누락(-1) 처리되었음을 의미합니다.
이처럼 get_indexer_non_unique() 메서드는 중복 값을 허용하고, 존재하지 않는 값을 -1로 안전하게 처리해 주므로 복잡한 인덱스 재구성 작업에 유용하게 활용할 수 있습니다.