단위 환산

import pandas as pd

path = "auto-mpg.csv"

df = pd.read_csv(path, header=None)
df.columns = ['mpg', 'cylinders',
              'displacement', 'horsepower',
              'weight', 'accelerationi',
              'model year', 'origin', 'name']

# mile per gallon -> killometer per liter
mpg_to_kpl = 1.60934/3.7854

df['kpl'] = df['mpg'] * mpg_to_kpl
df['kpl'] = df['kpl'].round(2)

print(df['kpl'].head(3))
0    7.65
1    6.38
2    7.65
Name: kpl, dtype: float64

자료형 변환

예제에서 마력은 문자열(object)로 되어있다. 이렇게 데이터 중간에 '?'와 같은 문자열이 있으면 문자열로 인식할 수 있다. 고유값을 확인해보자.

import pandas as pd

path = "auto-mpg.csv"

df = pd.read_csv(path, header=None)
df.columns = ['mpg', 'cylinders',
              'displacement', 'horsepower',
              'weight', 'accelerationi',
              'model year', 'origin', 'name']

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']

중간에 '?' 문자가 존재한다. 해당 문자를 NaN으로 변환하고 누락데이터로 처리해 삭제하면 모든 데이터를 숫자로 변환이 가능하다.

import pandas as pd
import numpy as np

path = "auto-mpg.csv"

df = pd.read_csv(path, header=None)
df.columns = ['mpg', 'cylinders',
              'displacement', 'horsepower',
              'weight', 'accelerationi',
              'model year', 'origin', 'name']

# '?' 문자열을 NaN으로 변환
df['horsepower'].replace('?', np.NaN, inplace=True)

# 'horsepower'열에 NaN이 있는 행을 모두 삭제
df.dropna(subset=['horsepower'], axis=0, how='any', inplace=True)

# 'horsepower'의 모든 데이터를 float으로 변경
df['horsepower'] = df['horsepower'].astype(float)

print(df['horsepower'].dtypes)
float64

'origin'에는 정수형 데이터인 1, 2, 3이 들어있는데 이는 실제로 USA, EU, JPN으로 대응된다. replace를 통해 변경하면 된다.

replace는 dict로 동시 처리가 가능하다.

USA, JPN, EU 이런식으로 고유값이 반복될 때는 범주형(category) 데이터를 사요하는 게 좋다.

import pandas as pd
import numpy as np

path = "auto-mpg.csv"

df = pd.read_csv(path, header=None)
df.columns = ['mpg', 'cylinders',
              'displacement', 'horsepower',
              'weight', 'accelerationi',
              '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)
[1 3 2]
['USA' 'JPN' 'EU']
object

USA, EU, JPN과 같이 고윳값이 반복되는 경우 범주형(category) 데이터로 표현하는 것이 효율적이다.

import pandas as pd
import numpy as np

path = "auto-mpg.csv"

df = pd.read_csv(path, header=None)
df.columns = ['mpg', 'cylinders',
              'displacement', 'horsepower',
              'weight', 'accelerationi',
              'model year', 'origin', 'name']

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

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

print(df['origin'].unique())
print(df['origin'].dtypes)
[1 3 2]
['USA', 'JPN', 'EU']
Categories (3, object): ['USA', 'JPN', 'EU']
category