10_판다스6
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 |
댓글남기기