반응형
데이터셋은 여러 사람, 국가에서 만들어지기 때문에 단위, 대소문자, 약칭 등 여러가지 형태로 표현된다.
잘 정리되어 있어 보이는 데이터셋이라도 서로 다른 단위가 섞여 있거나 같은 대상을 여러 형식으로 표현한 경우가 존재한다. 이러한 경우를 표준화 시켜서 일관성을 갖게 해야 좋은 품질의 데이터를 얻을 수 있다.
### 단위 환산 ###
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
import pandas as pd
import numpy as np
##### 데이터 표준화 #####
### 단위 환산 ###
# 하나의 데이터 셋 안에 있는 데이터들은 같은 측정 단위를 가질 필요가 있다 #
# 외국에서 사용하는 야드, 온스 등의 단위는 우리에게 익숙한 평, 그램 등으로 바꿀 필요가 있다 #
df = pd.read_csv("C:/Users/ZenBook/Desktop/code/sample/part4/auto-mpg.csv", header=None)
df.columns = ['mpg', 'cylinders', 'displacement', 'horsepower', 'weight',
'acceleration', 'model year', 'origin', 'name']
# 파일의 'mpg' 열은 mile per gallon 이라는 단위를 사용하고 있다.
# 이것을 우리에게 익숙한 km/L (리터 당 킬로미터) 단위로 바꿀 필요가 있다.
mpg_to_kpl = 1.60934 / 3.78541
# mile per gallon 을 km/L로 변환
df['kpl'] = df['mpg'] * mpg_to_kpl
# mpg의 단위를 km/L로 변환한 'kpl'열 추가
df['kpl'] = df['kpl'].round(2)
# round(n) : 소수점 아래 n번째 자리에서 반올림
'''
mpg cylinders displacement horsepower weight acceleration model year origin name kpl
0 18.0 8 307.0 130.0 3504.0 12.0 70 1 chevrolet chevelle malibu 7.65
1 15.0 8 350.0 165.0 3693.0 11.5 70 1 buick skylark 320 6.38
2 18.0 8 318.0 150.0 3436.0 11.0 70 1 plymouth satellite 7.65
'''
|
cs |
### 자료형 변환 ###
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
### 자료형 변환 ###
# 숫자가 문자열로 저장되어 있을 경우 숫자형으로 변환해줘야 함 #
# .dtypes, info() 을 통해 각 열의 자료형 확인 #
# astype('자료형') 으로 형변환 #
print(df.info())
'''
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 mpg 398 non-null float64
1 cylinders 398 non-null int64
2 displacement 398 non-null float64
3 horsepower 398 non-null object
4 weight 398 non-null float64
5 acceleration 398 non-null float64
6 model year 398 non-null int64
7 origin 398 non-null int64
8 name 398 non-null object
9 kpl 398 non-null float64
'''
# horsepower가 문자열(object)로 구성되어있다. -> 숫자형이 적당하다.
# model year, origin이 숫자형으로 구성되어있다. -> 범주형이 적당하다.
print(df['horsepower'].unique())
'''
['130.0' '165.0' '150.0' '140.0' '198.0' '220.0' '215.0' '225.0' '190.0'
'170.0' '160.0' '95.00' '97.00' '85.00' '88.00' '46.00' '87.00' '90.00'
'113.0' '200.0' '210.0' '193.0' '?' '100.0' '105.0' '175.0' '153.0'
'180.0' '110.0' '72.00' '86.00' '70.00' '76.00' '65.00' '69.00' '60.00'
'80.00' '54.00' '208.0' '155.0' '112.0' '92.00' '145.0' '137.0' '158.0'
'167.0' '94.00' '107.0' '230.0' '49.00' '75.00' '91.00' '122.0' '67.00'
'83.00' '78.00' '52.00' '61.00' '93.00' '148.0' '129.0' '96.00' '71.00'
'98.00' '115.0' '53.00' '81.00' '79.00' '120.0' '152.0' '102.0' '108.0'
'68.00' '58.00' '149.0' '89.00' '63.00' '48.00' '66.00' '139.0' '103.0'
'125.0' '133.0' '138.0' '135.0' '142.0' '77.00' '62.00' '132.0' '84.00'
'64.00' '74.00' '116.0' '82.00']
'''
# horsepower 열 중간에 '?' 가 포함되어 있어서 read_csv 과정에서 문자열로 읽었다.
# '?'를 삭제하고 자료형을 숫자형으로 변환하자.
df['horsepower'].replace('?', np.nan, inplace = True)
# '?'를 numpy 라이브러리의 np.nan로 변환
df.dropna(subset=['horsepower'], axis=0, inplace= True)
# 누락데이터 (NaN) 행 삭제
df['horsepower'] = df['horsepower'].astype('float')
# horsepower열을 float 형으로 형변환
df['origin'].replace({1:'USA', 2:'EU', 3:'JPN'}, inplace= True)
# origin에는 저장된 1,2,3 정수를 문자열로 변환
df['origin'] = df['origin'].astype('category')
# origin 처럼 유한개의 고유값이 반복적으로 나타나는 경우 범주형으로 저장하는 것이 효율적임.
# origin의 데이터를 범주형으로 변환
print(df['model year'].sample(3))
'''
296 79
177 75
248 78
'''
# model year 열에는 예시와 같이 상대적으로 년도를 표현하는 정수가 저장되어 있다.
# 이러한 자료형은 범주형으로 나타내는 것이 적절하다.
df['model year'] = df['model year'].astype('category')
print(df['model year'])
'''
Categories (13, int64): [70, 71, 72, 73, ..., 79, 80, 81, 82]
'''
|
cs |
반응형
'Pandas' 카테고리의 다른 글
데이터 전처리 - 정규화 (0) | 2022.11.08 |
---|---|
데이터 전처리 - 범주형(category) 데이터 처리 (0) | 2022.11.08 |
데이터 전처리 - 중복 데이터 처리 (0) | 2022.11.06 |
데이터 전처리 - 누락 데이터 처리 (0) | 2022.11.06 |
Matplotlib 파이 차트 그리기 (0) | 2022.11.05 |