판다스에서 범주형 데이터를 정수로 코드화하는 다양한 방법
데이터 분석에서 범주형 데이터를 정수로 변환하면 데이터를 더 효율적으로 처리할 수 있습니다. 예를 들어, '사과', '바나나', '포도'와 같은 상품명을 각각 0, 1, 2로 매핑하는 것을 말합니다. 이해를 돕기 위해 간단한 예시를 살펴보겠습니다.
예시 데이터 생성
범주형 데이터를 정수로 변환하는 것은 대규모 데이터 처리에서 자주 필요한 작업이므로, 예시에서도 10,000행의 데이터를 생성합니다. 여러분도 아래 코드를 실행하면 동일한 10,000행의 데이터를 얻을 수 있습니다.
import pandas as pd
import numpy as np
pd.options.display.max_rows = 6 # 6행까지만 출력
np.random.seed(1)
goods = np.random.choice(['바나나', '사과', '포도'], 10000)
codes = [f'cu{str(i).zfill(4)}' for i in range(0, 10000)]
df = pd.DataFrame({'회원코드': codes, '상품': goods})
예시 데이터 프레임 df에서 '사과'는 0, '바나나'는 1, '포도'는 2로 매핑하는 다양한 방법을 살펴보겠습니다.
1. map 함수로 딕셔너리를 사용해 매핑
매핑은 map 함수를 사용하여 수행할 수 있습니다. 먼저 각 상품의 출현 순서에 따라 정수를 순차적으로 매칭한 딕셔너리를 생성합니다.
# 각 상품의 출현 순서에 따라 정수를 순차적으로 매칭한 딕셔너리 생성
m = {key: n for n, key in enumerate(df['상품'].unique())}
{'사과': 0, '바나나': 1, '포도': 2}
생성된 딕셔너리 m을 map 함수에 전달하면 상품 열을 정수로 매핑할 수 있습니다.
# 각 상품의 출현 순서에 따라 정수를 순차적으로 매칭한 코드 열 생성
df['코드'] = df['상품'].map(m)
2. apply 함수와 lambda를 이용한 매핑
map 함수 대신 apply 함수를 사용하면 딕셔너리를 직접 사용하여 매핑할 수는 없습니다. 대신 apply 함수는 함수를 사용해 매핑할 수 있기 때문에, lambda 함수를 생성하여 동일한 작업을 수행할 수 있습니다.
# 각 상품의 출현 순서에 따라 정수를 순차적으로 매칭한 코드 열 생성
df['코드'] = df['상품'].apply(lambda x: m[x])
3. factorize 함수를 이용한 매핑
factorize 함수는 범주형 데이터를 고유한 정수로 변환하는 작업에 특화된 함수입니다. 가장 간편하며 속도도 가장 빠릅니다. 가장 추천하는 방법입니다.
# 각 상품의 출현 순서에 따라 정수를 순차적으로 매칭한 코드 열 생성
df['코드'] = df['상품'].factorize()[0]
4. cat.codes 속성을 이용한 매핑
범주형 데이터를 카테고리(category) 자료형으로 다루고 있다면, cat.codes 속성을 사용해 쉽게 정수로 변환할 수 있습니다. 다만, 이 방법은 판다스 사용자들이 가장 어려워하는 자료형 중 하나인 카테고리 자료형을 다루어야 한다는 단점이 있습니다.
# 각 상품의 출현 순서에 따라 정수를 순차적으로 매칭한 코드 열 생성
df['코드'] = df['상품'].astype('category').cat.codes
결론
위에서 소개한 방법들은 각각의 장단점을 가지고 있습니다. map과 apply는 범용성이 뛰어나고, factorize는 특정 작업에 최적화되어 빠른 성능을 제공하며, cat.codes는 효율적이지만 카테고리 자료형에 대한 이해가 필요합니다. 이 중 가장 추천하는 방법은 factorize 함수를 사용하는 것입니다.
유튜브에서 판다스 강의 중입니다.
https://www.youtube.com/@KimPandas
'판다스 > 중급 판다스' 카테고리의 다른 글
[pandas] 특정 열의 값을 기준으로 행을 선택하는 방법 (0) | 2024.05.22 |
---|---|
[pandas] 영업일(business day)을 배열로 생성하는 방법 (0) | 2023.08.28 |
[pandas] 멀티 인덱스에서 특정 값 수정하기 (0) | 2023.08.23 |
[pandas] 시리즈에 apply 대신 map 함수로 매핑하는 이유 (0) | 2023.05.27 |
[pandas] 숫자로 바꿀 때 to_numeric과 astype의 차이 (0) | 2022.06.13 |