pandas에서 사용하는 데이엍 타입은 아래와 같다.
이 중에서 Pandas에만 있고, python, numpy에는 없는 category 타입에 대해서 간단하게 알아보자.
category 타입이란 text 값의 유한한 리스트를 표현할 때 사용하는 데이터 타입이다.
이렇게 말하면 잘 이해가 안갈 수 있는데 예를 살펴보면 간단하다.
- 사이즈 (X-Small, Small, Medium, Large, X-Large)
- 색깔 (빨강, 검정, 흰색)
- 스타일 (반팔, 긴팔)
pandas에서는 category 데이터를 어떻게 표현할 수 있는걸까?
category data type은 hybrid data type이다.
보기에는 string처럼 보이나 내부적으로는 integer의 배열로 표현이 되어있다.
이를 통해 사용자가 원하는대로 순서를 정해 저장할 수도 있고, 효율적으로 데이터 저장이 가능해진다.
그렇다면 왜 category 데이터를 써야 할까?
1. 만약에 위에 사이즈 데이터를 str로 저장한다고 해보자.
우리가 생각하기에 사이즈간의 순서는 “X-Small” < “Small” < “Medium” < “Large” < “X-Large” 가 되어야 한다(custom order)
그러나 str로 저장 시 알파벳 순서대로 정렬하게 되면 위와 같은 순서대로 정렬을 할 수가 없다.
2. categorical data type을 적절한 통계 모델 / plot types로 해석할 수 있는 파이썬 시각화 라이브러리들이 존재한다.
3. Categorical data는 더 적은 메모리를 사용하고 이는 성능 향상으로 이어진다.
* Categorical data 사용 예제 *
위에서 말한 사이즈 예제로 한 번 만들어보자.
5가지의 카테고리 데이터가 생겼음을 확인할 수 있다.
s = pd.Series(["Medium", "Large", "X-Small", "Large", "Small", "X-Large", "X-Small", "Medium", "X-Large"]).astype("category")
>>> s
0 Medium
1 Large
2 X-Small
3 Large
4 Small
5 X-Large
6 X-Small
7 Medium
8 X-Large
dtype: category
Categories (5, object): ['Large', 'Medium', 'Small', 'X-Large', 'X-Small']
pandas.Series.cat
series 데이터에서 categorical data에 접근하기 위해서는 .cat이라는 오브젝트를 사용하면 된다.
아래 명령어를 통해 현재 카테고리 정보를 확인할 수 있다.
>>> s.cat.categories
Index(['Large', 'Medium', 'Small', 'X-Large', 'X-Small'], dtype='object')
그러나 아직 순서는 우리가 원하는 “X-Small” < “Small” < “Medium” < “Large” < “X-Large” 로 되어있지 않다.
초기에는 시리즈 내에 있는 데이터를 가지고 알파벳 순서로 정렬이 되어 있다.
custom order를 사용하고자 할 때는 cat.reorder_categories로 원하는 순서를 지정해주면 된다.
그러면 아래와 같이 카테고리의 순서가 바뀐 것을 확인할 수 있다.
>>> s.cat.reorder_categories(["X-Small", "Small", "Medium", "Large", "X-Large"], inplace = True)
0 Medium
1 Large
2 X-Small
3 Large
4 Small
5 X-Large
6 X-Small
7 Medium
8 X-Large
dtype: category
Categories (5, object): ['X-Small', 'Small', 'Medium', 'Large', 'X-Large']
또한 카테고리를 추가하고자 할 때에는 .cat.add_categories
삭제할 때에는 .cat.remove_categories
사용되지 않는 카테고리만 삭제할 때에는 .cat.remove_unused_categories
또한 .cat.as_ordered()를 통해 카테고리 데이터 간 대소비교도 확인할 수 있다.
>>> s.cat.as_ordered()
0 Medium
1 Large
2 X-Small
3 Large
4 Small
5 X-Large
6 X-Small
7 Medium
8 X-Large
dtype: category
Categories (5, object): ['X-Small' < 'Small' < 'Medium' < 'Large' < 'X-Large']
참고자료)
'Programming > Python' 카테고리의 다른 글
[sklearn] Target is multiclass Error 해결 (0) | 2022.01.18 |
---|---|
[Pandas] DataFrame 모든 행, 열 출력하기 (0) | 2021.12.01 |
[Python] max 내장 함수와 선택인자(key, default) (0) | 2021.12.01 |
[Python 3.x] 바이트 스트림(byte-stream) 객체의 등장 (0) | 2021.11.28 |
PyG 란? (0) | 2021.11.16 |