Language/파이썬

파이썬 '판다스 데이터 분석' - 단위 변환, 자료형 변환 .astype('float'), unique(), nunique(), replace({ type: dict},inplace=True)

javapp 자바앱 2021. 7. 19. 00:00
728x90

단위 변환

서로 다른 단위가 섞여 있거나 같은 대상을 다른 형식으로 표현하면 분석의 정확도는 현저히 낮아진다.
데이터 포맷을 일관성있게 표준화 하는 작업이 필요하다.
마일 야드 온스 -> 미터 평 그램

auto-mpg.csv
0.02MB
import pandas as pd

df = pd.read_csv('data/auto-mpg.csv', header=None)
df.columns=['mpg','cylinders','displacement','horsepower','weight','acceleration','model year','origin','name']

 

마일  -> 킬로미터 

mpg_to_kpl = 1.60934/3.78541
df['kpl'] = (df['mpg'] * mpg_to_kpl).round(2)
df['kpl'].head()
<결과>
0    7.65
1    6.38
2    7.65
3    6.80
4    7.23
Name: kpl, dtype: float64

 

 

자료형 변환

숫자가 문자열(object)로 저장된 경우에 숫자형(int or float)으로 변환해야 한다.

 

각 열의 자료형

.dtypes

df.dtypes
<결과>
mpg             float64
cylinders         int64
displacement    float64
horsepower       object
weight          float64
acceleration    float64
model year        int64
origin            int64
name             object
kpl             float64
dtype: object

 

열의 고유값 확인

.unique() / .nunique() : 고유값 갯수

df['horsepower'].unique()
<결과>
array([130., 165., 150., 140., 198., 220., 215., 225., 190., 170., 160.,
        95.,  97.,  85.,  88.,  46.,  87.,  90., 113., 200., 210., 193.,
       100., 105., 175., 153., 180., 110.,  72.,  86.,  70.,  76.,  65.,
        69.,  60.,  80.,  54., 208., 155., 112.,  92., 145., 137., 158.,
       167.,  94., 107., 230.,  49.,  75.,  91., 122.,  67.,  83.,  78.,
        52.,  61.,  93., 148., 129.,  96.,  71.,  98., 115.,  53.,  81.,
        79., 120., 152., 102., 108.,  68.,  58., 149.,  89.,  63.,  48.,
        66., 139., 103., 125., 133., 138., 135., 142.,  77.,  62., 132.,
        84.,  64.,  74., 116.,  82.])

중복을 제외한 unique 값의 갯수 (유니크한 값의 갯수)

갯수가 작은것은 카테고리컬한 데이터일 수 있다.

df.nunique()

df.unique()

 

<결과>
mpg             129
cylinders         5
displacement     82
horsepower       94
weight          351
acceleration     95
model year       13
origin            3
name            305
dtype: int6

 

자료형 변환

df['horsepower'] = df['horsepower'].astype('float')
df['horsepower'].dtypes

dtype('float64')

 

.replace()

replace() 메소드를 사용하여 숫자 데이터를 문자열로 바꾸면 자동으로 object 자료형으로 변경된다.

df['origin'].replace({1:'USA', 2:'EU', 3:'JPN'},inplace=True)
print(df['origin'].unique())
print(df['origin'].dtypes)
<결과>
['USA' 'JPN' 'EU']
object

 

 

'model year' 열에는 연도를 나타내는 값들이 숫자: int 형태로 기록되어있다.

연도를 뜻하기 때문에, 연도는 시간적인 순서의 의미가 있으나 숫자의 상대적인 크기는 별 의미가 없다.

데이터는 숫자 형태를 갖더라도 자료형은 범주형(category)으로 표현하는 것이 적절하다.

 

df['model year'].sample(3)
<결과>
146    74
139    74
29     71
Name: model year, dtype: int64

 

자료형 변환

Cast a pandas object to a specified dtype.
타입을 바꾼다.
df.astype({'mpg':'float32'})

df['model year'] = df['model year'].astype('category')
df['model year'].sample(3)
<결과>
90     73
267    78
3      70
Name: model year, dtype: category
Categories (13, int64): [70, 71, 72, 73, ..., 79, 80, 81, 82]

시리즈 방법

df['mpg'] = df['mpg'].astype('float')

 

 

Return a subset of the DataFrame’s columns based on the column dtypes.

df.select_dtypes(exclude=['타입']) : 타입 제외

df.select_dtypes(exclude=['object']).head()
<결과>
    mpg  cylinders  displacement  weight  acceleration  model year  origin
0  18.0        8.0         307.0  3504.0          12.0        70.0     1.0
1  15.0        8.0         350.0  3693.0          11.5        70.0     1.0
2  18.0        8.0         318.0  3436.0          11.0        70.0     1.0
3  16.0        8.0         304.0  3433.0          12.0        70.0     1.0
4  17.0        8.0         302.0  3449.0          10.5        70.0     1.0

 

df.select_dtypes(include=['타입']) : 타입 포함

df.select_dtypes(include=['object']).head()
	horsepower	name
0	130.0	chevrolet chevelle malibu
1	165.0	buick skylark 320
2	150.0	plymouth satellite
3	150.0	amc rebel sst
4	140.0	ford torino