[python] dataframe - categorical

Categorical 데이터 타입은 pandas에서 범주형 데이터를 표현하는데 사용됩니다. 범주형 데이터는 일반적으로 한정된 수의 가능한 값들을 갖는 데이터 유형을 의미합니다. 예를 들어, '받는사람', '참조', '숨은참조'와 같이 정해진 범주 내에서 값이 결정되는 경우가 이에 해당합니다.

Categorical의 원리 및 장점
메모리 효율성: 범주형 데이터는 종종 문자열로 표현되지만, 문자열은 메모리를 많이 사용합니다. Categorical 데이터 타입은 각 범주를 정수로 매핑하여 메모리 사용을 최적화합니다.

성능 향상: 정수 기반의 범주형 데이터는 문자열 데이터에 비해 연산이 빠릅니다. 이는 데이터 정렬, 그룹화 시 성능 향상으로 이어질 수 있습니다.

명시적인 범주 정의: Categorical 타입을 사용하면 데이터의 범주를 명확하게 정의할 수 있으며, 이를 통해 데이터의 유효성을 쉽게 관리할 수 있습니다.

Categorical 사용 예시
예를 들어, '고양이', '개', '토끼'와 같은 동물 범주가 있다고 가정해보겠습니다. 이를 Categorical 타입으로 변환하고, 이를 활용한 간단한 작업을 수행하는 예시는 다음과 같습니다.

import pandas as pd

# 데이터 생성
data = {'동물': ['고양이', '개', '토끼', '개', '고양이']}
df = pd.DataFrame(data)

# 동물 컬럼을 Categorical로 변환
df['동물'] = pd.Categorical(df['동물'], categories=['고양이', '개', '토끼'], ordered=True)

# Categorical 데이터 확인
print(df['동물'])
print(df['동물'].cat.categories)  # 정의된 범주 확인
print(df['동물'].cat.codes)      # 내부적으로 매핑된 정수 코드 확인

# 범주형 데이터를 활용한 정렬
df_sorted = df.sort_values(by='동물')
print(df_sorted)

결과출력

0    고양이
1      개
2     토끼
3      개
4    고양이
Name: 동물, dtype: category
Categories (3, object): ['고양이' < '개' < '토끼']
Index(['고양이', '개', '토끼'], dtype='object')
0    0
1    1
2    2
3    1
4    0
dtype: int8
    동물
0  고양이
4  고양이
1    개
3    개
2   토끼

이 예시에서 Categorical 데이터 타입을 사용하면 범주들이 '고양이', '개', '토끼' 순서로 정렬됩니다. 이는 Categorical 타입이 범주들을 내부적으로 정수 값에 매핑하여 관리하기 때문에 가능합니다. cat.categories를 사용하여 정의된 범주를 확인할 수 있으며, cat.codes를 사용하여 각 데이터가 어떤 정수 값에 매핑되었는지 확인할 수 있습니다.

이처럼 Categorical 타입을 사용하면 범주형 데이터를 더 효율적으로 처리할 수 있으며, 데이터 분석 및 처리 과정에서 여러 이점을 제공합니다.

# 실제 예시 - 사용자 정의 정렬 순서 설정

sort_order = ['받는사람', '참조', '숨은참조']
df['receiveTypeName'] = pd.Categorical(df['receiveTypeName'], categories=sort_order, ordered=True)

# 정렬 수행
df = df.sort_values(by=['requestDate', 'receiveTypeName'], ascending=[False, True])

Subscribe to Keun's newsletter and stay updated.

Don't miss anything. Get all the latest posts delivered straight to your inbox. It's free!
Great! Check your inbox and click the link to confirm your subscription.
Error! Please enter a valid email address!