데이터 분석 과정에서 문자열로 구성된 리스트나 시리즈를 숫자형 인덱스로 변환해야 하는 경우가 종종 있습니다. 예를 들어 다음과 같은 과일 이름 리스트가 있고, 각 고유값에 알파벳순으로 정렬된 숫자형 인덱스를 부여한다고 가정해 보겠습니다.
Sorted distinct values - numeric array index [2 3 0 3 2 1 4] ['apple' 'kiwi' 'mango' 'orange' 'pomegranate']
이 문제는 pandas의 pd.factorize() 함수를 활용하면 간단하게 해결할 수 있습니다. 아래 단계를 따라 살펴보겠습니다.
해결 방법
1단계: 기본 factorize() 적용
중복 값을 포함한 리스트에 pd.factorize() 함수를 적용한 뒤, 그 결과를 index와 unique_value 두 변수에 저장합니다.
index, unique_value = pd.factorize(['mango','orange','apple','orange','mango','kiwi','pomegranate'])
이 상태에서 인덱스와 고유값을 출력하면, 값들이 정렬되지 않은 채 리스트에 처음 등장한 순서대로 인코딩된 결과를 확인할 수 있습니다.
2단계: sort=True 옵션 적용
이번에는 pd.factorize() 함수에 sort=True 옵션을 지정하여 실행하고, 결과를 sorted_index와 unique_value에 저장합니다.
sorted_index, unique_value = pd.factorize(['mango','orange','apple','orange','mango','kiwi','pomegranate'], sort=True)
sort=True가 설정되면 고유값들이 오름차순(알파벳순)으로 정렬되고, 원본 리스트의 각 요소에는 정렬된 순서에 맞는 숫자형 인덱스가 새로 부여됩니다.
3단계: 결과 출력
마지막으로 숫자형 인덱스 배열과 정렬된 고유값을 화면에 출력합니다.
전체 예제 코드
아래 코드를 직접 실행해 보면 동작을 더욱 명확하게 이해할 수 있습니다.
import pandas as pd
# 정렬 없이 factorize 적용
index, unique_value =
pd.factorize(['mango','orange','apple','orange','mango','kiwi','pomegranate'])
print("정렬되지 않은 고유값 - 숫자형 배열 인덱스")
print(index)
print(unique_value)
# sort=True 옵션으로 factorize 적용
print("정렬된 고유값 - 숫자형 배열 인덱스")
sorted_index, unique_value =
pd.factorize(['mango','orange','apple','orange','mango','kiwi','pomegranate'], sort=True)
print(sorted_index)
print(unique_value)
실행 결과
정렬되지 않은 고유값 - 숫자형 배열 인덱스 [0 1 2 1 0 3 4] ['mango' 'orange' 'apple' 'kiwi' 'pomegranate'] 정렬된 고유값 - 숫자형 배열 인덱스 [2 3 0 3 2 1 4] ['apple' 'kiwi' 'mango' 'orange' 'pomegranate']
결과 해석
sort=True를 적용하기 전에는 'mango'→0, 'orange'→1, 'apple'→2, 'kiwi'→3, 'pomegranate'→4처럼 데이터에 처음 나타난 순서대로 인덱스가 매겨집니다. 반면 sort=True를 적용하면 고유값이 ['apple', 'kiwi', 'mango', 'orange', 'pomegranate'] 순으로 정렬되고, 원본 리스트의 각 항목은 정렬된 위치에 대응하는 인덱스 [2 3 0 3 2 1 4]로 변환됩니다.
이처럼 pd.factorize()는 범주형 문자열 데이터를 머신러닝 모델의 입력값으로 사용할 수 있는 수치형 코드로 변환할 때 특히 유용합니다. sort=True 옵션 하나만 추가하면 원하는 정렬 순서의 인코딩 결과를 손쉽게 얻을 수 있습니다.