4 분 소요

import warnings
warnings.filterwarnings('ignore')
from IPython.display import Image
import numpy as np
import pandas as pd
#!pip install seaborn부터 시작하자

import seaborn as sns

자료형 변환하기

print(sns.get_dataset_names())
['anagrams', 'anscombe', 'attention', 'brain_networks', 'car_crashes', 'diamonds', 'dots', 'exercise', 'flights', 'fmri', 'gammas', 'geyser', 'iris', 'mpg', 'penguins', 'planets', 'taxis', 'tips', 'titanic']
#seaborn 라이브러리가 제공하는 tips 데이터 집합을 불러온다.
tips = sns.load_dataset('tips')
print(type(tips))
tips
<class 'pandas.core.frame.DataFrame'>
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
... ... ... ... ... ... ... ...
239 29.03 5.92 Male No Sat Dinner 3
240 27.18 2.00 Female Yes Sat Dinner 2
241 22.67 2.00 Male Yes Sat Dinner 2
242 17.82 1.75 Male No Sat Dinner 2
243 18.78 3.00 Female No Thur Dinner 2

244 rows × 7 columns

tips.dtypes
#category => 범주. 분류를 위함
total_bill     float64
tip            float64
sex           category
smoker        category
day           category
time          category
size             int64
dtype: object
tips.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 244 entries, 0 to 243
Data columns (total 7 columns):
 #   Column      Non-Null Count  Dtype   
---  ------      --------------  -----   
 0   total_bill  244 non-null    float64 
 1   tip         244 non-null    float64 
 2   sex         244 non-null    category
 3   smoker      244 non-null    category
 4   day         244 non-null    category
 5   time        244 non-null    category
 6   size        244 non-null    int64   
dtypes: category(4), float64(2), int64(1)
memory usage: 7.3 KB
#자료형 변환하려면 astype()함수를 사용한다.
#판다스의 categoryw 자료형은 R의 factor와 같은
#범주형 데이터를 의미한다. 범주형 데이터는 연산을
#위한 데이터가 아니고 분류를 위한 것이다.

#time열의 데이터를 astype()함수를 사용해서 
#category 타입을 문자열(object)로 변환해서
#time_str이라는 새로운 열을 만든다.
#(판다스에선 object가 문자열이다.)
tips['time_str'] = tips['time'].astype(str)
tips.dtypes
total_bill     float64
tip            float64
sex           category
smoker        category
day           category
time          category
size             int64
time_str        object
dtype: object

잘못 입력한 문자열 처리하기

tips_sub_miss = tips.head(10)
tips_sub_miss
total_bill tip sex smoker day time size time_str
0 16.99 1.01 Female No Sun Dinner 2 Dinner
1 10.34 1.66 Male No Sun Dinner 3 Dinner
2 21.01 3.50 Male No Sun Dinner 3 Dinner
3 23.68 3.31 Male No Sun Dinner 2 Dinner
4 24.59 3.61 Female No Sun Dinner 4 Dinner
5 25.29 4.71 Male No Sun Dinner 4 Dinner
6 8.77 2.00 Male No Sun Dinner 2 Dinner
7 26.88 3.12 Male No Sun Dinner 4 Dinner
8 15.04 1.96 Male No Sun Dinner 2 Dinner
9 14.78 3.23 Male No Sun Dinner 2 Dinner
#tips_sub_miss.loc[[1,3,5,7], 'total_bill'] = 'missing'
tips_sub_miss.iloc[[1,3,5,7], 0] = 'missing'
tips_sub_miss
total_bill tip sex smoker day time size time_str
0 16.99 1.01 Female No Sun Dinner 2 Dinner
1 missing 1.66 Male No Sun Dinner 3 Dinner
2 21.01 3.50 Male No Sun Dinner 3 Dinner
3 missing 3.31 Male No Sun Dinner 2 Dinner
4 24.59 3.61 Female No Sun Dinner 4 Dinner
5 missing 4.71 Male No Sun Dinner 4 Dinner
6 8.77 2.00 Male No Sun Dinner 2 Dinner
7 missing 3.12 Male No Sun Dinner 4 Dinner
8 15.04 1.96 Male No Sun Dinner 2 Dinner
9 14.78 3.23 Male No Sun Dinner 2 Dinner
tips_sub_miss.dtypes
total_bill      object
tip            float64
sex           category
smoker        category
day           category
time          category
size             int64
time_str        object
dtype: object
#문자열이 0~9까지 숫자가 아니라면 float으로 변환이 불가능하다.

#tips_sub_miss ['total_bill'] = tips_sub_miss.total_bill.astype(float)
#tips_sub_miss데이터프레임의 total_bill열을 astype()함수를 사용해서
#실수로 변환을 시도하면 'missing'이라는 문자열 때문에 오류가 발생한다.
#판다스의 to_numeric()함수를 사용해도 문자열을 실수로
#변환할 수 있다.
#errors 속성을 'ignore'로 지정하면 함수 실행시 오류가 발생되면 
#함수를 무시해버리기 때문에 자료형이 변한되지 않는다.
tips_sub_miss ['total_bill'] = pd.to_numeric(tips_sub_miss.total_bill, errors = 'ignore')
tips_sub_miss
total_bill tip sex smoker day time size time_str
0 16.99 1.01 Female No Sun Dinner 2 Dinner
1 missing 1.66 Male No Sun Dinner 3 Dinner
2 21.01 3.50 Male No Sun Dinner 3 Dinner
3 missing 3.31 Male No Sun Dinner 2 Dinner
4 24.59 3.61 Female No Sun Dinner 4 Dinner
5 missing 4.71 Male No Sun Dinner 4 Dinner
6 8.77 2.00 Male No Sun Dinner 2 Dinner
7 missing 3.12 Male No Sun Dinner 4 Dinner
8 15.04 1.96 Male No Sun Dinner 2 Dinner
9 14.78 3.23 Male No Sun Dinner 2 Dinner
#to_numeric()함수는 errors 속성을 사용하면 어느정도 오류를
#제어할 수 있다.
#errors 속성을 지정하지 않으면 'raise'가 기본값으로 사용되며
#변환할 수 없는 값이 있으면 오류를 발생시킨다.
tips_sub_miss ['total_bill'] = pd.to_numeric(tips_sub_miss.total_bill, errors = 'raise')
tips_sub_miss
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

pandas\_libs\lib.pyx in pandas._libs.lib.maybe_convert_numeric()


ValueError: Unable to parse string "missing"

During handling of the above exception, another exception occurred:


ValueError                                Traceback (most recent call last)

<ipython-input-52-19cf7865bf37> in <module>
      3 #errors 속성을 지정하지 않으면 'raise'가 기본값으로 사용되며
      4 #변환할 수 없는 값이 있으면 오류를 발생시킨다.
----> 5 tips_sub_miss ['total_bill'] = pd.to_numeric(tips_sub_miss.total_bill, errors = 'raise')
      6 tips_sub_miss


c:\python\lib\site-packages\pandas\core\tools\numeric.py in to_numeric(arg, errors, downcast)
    151         try:
    152             values = lib.maybe_convert_numeric(
--> 153                 values, set(), coerce_numeric=coerce_numeric
    154             )
    155         except (ValueError, TypeError):


pandas\_libs\lib.pyx in pandas._libs.lib.maybe_convert_numeric()


ValueError: Unable to parse string "missing" at position 1
#erorrs속성을 'coerce'로 지정하면 함수 실행시 오류가 발생될 때 오류가 발생된
#데이터를 nan으로 바꾼다.
tips_sub_miss ['total_bill'] = pd.to_numeric(tips_sub_miss.total_bill, errors='coerce')
tips_sub_miss
total_bill tip sex smoker day time size time_str
0 16.99 1.01 Female No Sun Dinner 2 Dinner
1 NaN 1.66 Male No Sun Dinner 3 Dinner
2 21.01 3.50 Male No Sun Dinner 3 Dinner
3 NaN 3.31 Male No Sun Dinner 2 Dinner
4 24.59 3.61 Female No Sun Dinner 4 Dinner
5 NaN 4.71 Male No Sun Dinner 4 Dinner
6 8.77 2.00 Male No Sun Dinner 2 Dinner
7 NaN 3.12 Male No Sun Dinner 4 Dinner
8 15.04 1.96 Male No Sun Dinner 2 Dinner
9 14.78 3.23 Male No Sun Dinner 2 Dinner

댓글남기기