🚦 Summary
- Series 데이터 생성시 사용하는 옵션인 dtype를 활용한 효율적이면서 유용한 데이터 변환 방법과 사례들을 소개합니다.
📌 Intro.
-
pandas의 series를 공부하다보면 series 데이터 생성시에 dtype을 지정할 수 있다는 것을 배웁니다.
-
이러한 형변환 기능을 통해 다양한 유형의 데이터를 좀 더 손쉽고 효율적으로 바꾸거나 생성할 수 있는 팁을 정리해 공유합니다.
숫자로된 string형태의 데이터 만들기
-
일반적으로 숫자로된 형태의 시리즈 데이터를 만들려면 “” 또는 ‘‘를 숫자에 둘러줘야합니다.
-
이를 여러개의 숫자에 작업하려면 실제로 굉장히 많은 타이핑을 해야 합니다.
-
하지만 dtype을 통해 이를 좀 더 효율적으로 생성할 수 있습니다.
1
2
3
import pandas as pd
1
2
3
4
5
6
7
8
9
# 숫자지만 문자열 타입의 데이터로 만들 때
number_series = pd.Series(['1', '2', '3'], index=['idx1', 'idx2', 'idx3'], dtype=str)
print(type(number_series), ',', number_series[0], ',', type(number_series[0]))
<class 'pandas.core.series.Series'> , 1 , <class 'str'>
-
생성된 number_seires는 시리즈 형태의 데이터 이며 그 안에 담긴 0번째 인자는 string 임을 알 수 있습니다.
-
이를 좀 더 손쉽게 생성해 보도록 하겠습니다.
1
2
3
4
5
6
7
# 숫자 리스트를 문자열로 변환하는 경우
number_series = pd.Series([1, 2, 3], index=['idx1', 'idx2', 'idx3'], dtype=str)
print(type(number_series), ',', number_series[0], ',', type(number_series[0]))
<class 'pandas.core.series.Series'> , 1 , <class 'str'>
-
단순히 ‘ ‘를 둘러주는 것을 생략하였을 뿐이지만 실제로 타이핑하는 것에 대한 부담이 현저히 줄게 됩니다.
-
이와 같이 시리즈 생성시에 입력하는 옵션값이 dtype를 이용해 숫자값을 가진 string형태의 시리즈 데이터를 더욱 효율적으로 생성했습니다.
- 위와 같이 입력의 번고로움을 줄이는 방식은 아니지만 ‘dytpe’을 응용한 손쉬운 데이터 변환이라는 방법에서 몇가지 예시가 더 있습니다.ㅋ
날짜 데이터 입력 간소화
- 일반적으로 날짜형태의 데이터를 입력한다고 해도 날짜형식으로 변경되지는 않으며, 별도의 변경작업을 거쳐야 합니다.
1
2
3
4
5
6
7
8
9
# 문자열 형태로 날짜 데이터 입력
date_series = pd.Series(['2020-01-01', '2020-01-02', '2020-01-03'])
print(type(date_series), ',', date_series[0], ',', type(date_series[0]))
<class 'pandas.core.series.Series'> , 2020-01-01 , <class 'str'>
- 하지만 아래와 같이 dtype을 통해 손쉽게 생성과 동시에 datetime형태의 데이터로 변경할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
# dtype을 이용해 날짜 데이터 타입으로 자동 변환
# datetime64[ns]에서 ns는 nano sec을 의미
date_series = pd.Series(['2020-01-01', '2020-01-02', '2020-01-03'], dtype='datetime64[ns]')
print(type(date_series), ',', date_series[0], ',', type(date_series[0]))
<class 'pandas.core.series.Series'> , 2020-01-01 00:00:00 , <class 'pandas._libs.tslibs.timestamps.Timestamp'>
- 원래대로라면 생성된 데이터에 astype()를 써서 변경해야 합니다.
1
2
3
4
5
6
7
8
9
date_series = pd.Series(['2020-01-01', '2020-01-02', '2020-01-03'])
date_series = date_series.astype('datetime64[ns]')
print(type(date_series), ',', date_series[0], ',', type(date_series[0]))
<class 'pandas.core.series.Series'> , 2020-01-01 00:00:00 , <class 'pandas._libs.tslibs.timestamps.Timestamp'>
범주형 데이터를 수치형으로 손쉽게 변환하기
-
통상적으로 범주형 데이터를 수치형으로 변환하기 위해서는 Label Encoding이나 One-Hot Encoding을 사용해야 합니다.
-
low, medium, high라는 데이터에 대해 Label encoding과 One-Hot Encoding을 적용하는 코드는 아래와 같습니다.
레이블 인코딩을 통한 범주형 데이터의 수치화
- 레이블 인코딩은 각 범주를 숫자 값으로 변환합니다. 아래와 같이 세개의 범주 ‘low’, ‘medium’, ‘high’ 가 있는 경우 이 데이터를 각각 0, 1, 2로 매핑하여 수치로 변경 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from sklearn.preprocessing import LabelEncoder
# 범주형 데이터
categories = ['low', 'medium', 'high']
# 레이블 인코더 생성 및 피팅
label_encoder = LabelEncoder()
label_encoded = label_encoder.fit_transform(categories)
print(type(label_encoded), label_encoded)
<class 'numpy.ndarray'> [1 2 0]
- 하지만 dtype를 사용하면 좀 더 손쉽게 범주형 데이터를 수치형으로 변경할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
# dtype을 이용해 범주형 데이터를 수치형으로 변환
category_series = pd.Series(['low', 'medium', 'high'], dtype='category')
category_encoded = category_series.cat.codes
print(type(category_encoded))
print(category_encoded) # 좌측은 index, 우측은 값
<class 'pandas.core.series.Series'> 0 1 1 2 2 0 dtype: int8
-
라벨 인코딩과 시리즈의 dtype 변경방법모두 문자열을 알파뱃순으로 숫자를 할당하기 때문에 high가 0이 됩니다.
-
이런 방식의 인코딩을 하는 것은 원한 인코딩고 간이 범주데이터가 가지고 잇는 순서나 중요도를 없애고 개별 데이터로서 보기위한 변환이기 때문임을 명심해야 합니다.
정수형 데이터를 부동소수점으로 변환하기
- 일반적인 정수형 데이터를 시리즈로 만들면 단순히 int64 type의 데이터가 됩니다.
1
2
3
4
5
6
7
8
9
# 정수형 데이터 입력
integer_series = pd.Series([1, 2, 3])
print(type(integer_series), ',', integer_series[0], ',', type(integer_series[0]))
<class 'pandas.core.series.Series'> , 1 , <class 'numpy.int64'>
- 이러한 데이터를 생성할 때 dtype를 float로 지정하면 소수점을 가진 숫자 데이터로 일괄 변경이 가능합니다.
1
2
3
4
5
6
7
8
9
# dtype을 이용해 정수형 데이터를 부동소수점으로 변환
float_series = pd.Series([1, 2, 3], dtype=float)
print(type(float_series), ',', float_series[0], ',', type(float_series[0]))
<class 'pandas.core.series.Series'> , 1.0 , <class 'numpy.float64'>
bool 타입 시리즈의 빠른 생성
- 보통 시리즈로 bool타입의 데이터를 만들려면 문자열로 입력한뒤에 각 문자에 T/F를 맵핑해 줘야 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 불리언 데이터를 문자열로 입력
boolean_series = pd.Series(['True', 'False', 'True', 'False'])
print(type(boolean_series[0]))
# 문자열 데이터를 불리언 타입으로 변환
boolean_series = boolean_series.map({'True': True, 'False': False})
print(type(boolean_series[0]))
<class 'str'> <class 'numpy.bool_'>
- 하지만 dtype를 사용한다면 아래와 같이 1줄의 코드로 bool타입의 데이터를 만들 수 있습니다.
1
2
3
4
5
6
7
8
9
# 직접 불리언 타입으로 데이터 생성
boolean_series = pd.Series([True, False, True, False], dtype=bool)
print(type(boolean_series[0]), boolean_series[0])
<class 'numpy.bool_'> True
✔️ Outro.
-
판다스의 시리즈에 대해 공부하다가 우연히 발견하게 된 효율적인 데이터 변환 및 생성 방법에 대해 정리를 해봤습니다.
-
사실 맨 처음 제공한 숫자로된 str 데이터를 만드는 방법을 제외하고는 통상적인 dtype을 쓰는 방법에 대한 소개에 더 가까운 글이 되었습니다.
-
하지만 단순히 각 형태에 맞는 format으로 시리즈 데이터를 생성하면 대체로 그 타입에 맞는 데이터들이 생성되는 것에 비해 몇몇 데이터는 그러한 점이 적용되지 않습니다.
-
이번 포스팅에서 예시로 든 것들이 그런 데이터 타입의 대표적인 예시들이라 볼 수 있습니다.
댓글남기기