[데이터 사전 처리/데이터 표준화] 자료형 변환

2022. 12. 2. 13:33

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

먼저 dtypes 속성을 사용하여 데이터프레임을 구성하는 각 열의 자료형을 확인한다.

dtypes 속성 대신 info() 메소드를 사용해도 각 열을 자료형을 확인할 수 있다.

 

# 예제 5-9(1)

import pandas as pd

df = pd.read_csv('auto-mpg.csv', header=None)

df.columns = ['mpg', 'cylinders', 'displacement', 'horsepower', 'weight', 'acceleration', 'model year', 'origin', 'name']

print(df.dtypes)
print('\n')

 

예제 5-9(1) 출력 결과


예제에서 엔진 출력을 나타내는 'horsepower' 열은 숫자형이 적절하고, 출시연도를 나타내는 'model year' 열과 출시국가를 뜻하는 'origin' 열은 카테고리를 나타내는 범주형이 적절하다.

 

'horsepower' 열은 문자열을 뜻하는 object 자료형이다. 그러나 엔진 출력의 크기를 나타내는 데이터인 만큼 숫자형으로 변환해 주는 것이 적절하다.

엔진 출력이 문자열로 저장된 이유는 'horsepower' 열의 고유값을 출력해보면 알 수 있다.

# 예제 5-9(2)

import pandas as pd

df = pd.read_csv('auto-mpg.csv', header=None)

df.columns = ['mpg', 'cylinders', 'displacement', 'horsepower', 'weight', 'acceleration', 'model year', 'origin', 'name']

print(df['horsepower'].unique())
print('\n')

 

예제 5-9(2) 출력 결과

3번째 줄 중간에 문자열 '?'가 보인다. 고유값 중에 문자 '?'가 섞여 있어서 CSV 파일을 데이터프레임으로 변환하는 과정에서 문자열로 인식된 것으로 보인다.

 

# 예제 5-9(3)

import pandas as pd
import numpy as np

df = pd.read_csv('auto-mpg.csv', header=None)

df.columns = ['mpg', 'cylinders', 'displacement', 'horsepower', 'weight', 'acceleration', 'model year', 'origin', 'name']

df['horsepower'].replace('?', np.nan, inplace=True)
df.dropna(subset=['horsepower'], axis=0, inplace=True)
df['horsepower'] = df['horsepower'].astype('float')

print(df['horsepower'].dtypes)

'horsepower' 열을 문자열 '?'를 NaN값으로 변환한다.

dropna(axis=0) 메소드로 NaN값이 들어 있는 모든 행을 삭제한다.

이제 'horsepower' 열에는 숫자형으로 변환 가능한 값들만 남는다.

astype('float') 명령을 이용하여 문자열을 실수형으로 변환한다.

실수형 대신 정수형으로 변환하려면 'float' 대신 'int'를 입력한다.

 

예제 5-9(3) 출력 결과

dtypes 속성을 사용하여 변환된 결과를 보면 float으로 잘 변환된 것을 알 수 있다.

 

'origin' 열에는 정수형 데이터 1, 2, 3이 들어 있지만, 실제로는 국가이름인 'USA, EU, JPN'을 뜻한다.

replace() 메소드를 사용하여 각 숫자 데이터를 국가이름으로 바꿔주면 문자열을 나타내는 object 자료형으로 자동 변경된다.

# 예제 5-9(4)

import pandas as pd
import numpy as np

df = pd.read_csv('auto-mpg.csv', header=None)

df.columns = ['mpg', 'cylinders', 'displacement', 'horsepower', 'weight', 'acceleration', 'model year', 'origin', 'name']

print(df['origin'].unique())

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

 

예제 5-9(4) 출력 결과

 

이제 'origin' 열의 국가이름은 문자열 데이터(object)이다. 값을 확인해 보면 3개의 국가이름이 계속 반복된다.

이처럼 유한 개의 고유값이 반복적으로 나타나는 경우에는 범주형(category)데이터로 표현하는 것이 효율적이다.

astype('category') 메소드를 이용하면 범주형 데이터로 변환한다.

범주형을 다시 문자열로 변환하려면 astype('str') 메소드를 사용한다.

 

# 예제 5-9(5)

import pandas as pd
import numpy as np

df = pd.read_csv('auto-mpg.csv', header=None)

df.columns = ['mpg', 'cylinders', 'displacement', 'horsepower', 'weight', 'acceleration', 'model year', 'origin', 'name']

df['origin'] = df['origin'].astype('category')
print(df['origin'].dtypes)

df['origin'] = df['origin'].astype('str')
print(df['origin'].dtypes)

 

예제 5-9(5) 출력 결과

 

마지막으로 'model year' 열의 자료형을 살펴보자.

# 예제 5-9(6)

import pandas as pd
import numpy as np

df = pd.read_csv('auto-mpg.csv', header=None)

df.columns = ['mpg', 'cylinders', 'displacement', 'horsepower', 'weight', 'acceleration', 'model year', 'origin', 'name']

print(df['model year'].sample(3))
df['model year'] = df['model year'].astype('category')
print(df['model year'].sample(3))

 

예제 5-9(6) 출력 결과

먼저 sample() 메소드'model year' 열에서 무작위로 3개의 행을 선택해서 출력해본다.

81, 71, 77과 같이 모델 출시연도가 숫자로 기록되어 있고, 자료형은 정수형을 나타내는 int64이다.

연도를 뜻하기 때문에 숫자형으로 남겨둬도 무방하지만 연도는 시간적인 순서는 의미가 있으나 숫자의 상대적인 크기는 의미가 없다.

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


파이썬 머신러닝 판다스 데이터분석
저자 : 오승환
출판 : 정보문화사
발매 : 2019.06.05

 

BELATED ARTICLES

more