Pythonで機械学習モデルを開発する場合、開発に先立ってpandasでデータの読み込みや整理をすることが多い。
生データからモデルに役立つ情報を抽出するためのデータの加工や分析をおこなうことを「特徴量エンジニアリング」と言う。
モデルの開発を進めると、必ず分析ライブラリを使用することになるが、この分析ライブラリとpandasデータの接点になるのがNumpy配列だ。
ライブラリによってはpandasをサポートしており、自動的にデータフレームをNumpy配列に変換してくれるが、それができない場合は手動で変換処理を行わなければならない。
データフレームのvalues属性を使ってNumpy配列に変換する
では早速、pandasのデータフレームをNumpy配列に変換する例を見ていこう。
import pandas as pd
import numpy as np
data = pd.DataFrame({
'x0': [1, 2, 3, 4, 5],
'x1': [0.01, -0.01, 0.25, -4.1, 0.],
'x2': [-1.5, 0., 3.6, 1.3, -2.]
})
# x0 x1 x2
# 0 1 0.01 -1.5
# 1 2 -0.01 0.0
# 2 3 0.25 3.6
# 3 4 -4.10 1.3
# 4 5 0.00 -2.0
上記のデータフレームをNumpy配列に変換する場合、values属性を使うと良い。
data.values
# array([[ 1. , 0.01, -1.5 ],
# [ 2. , -0.01, 0. ],
# [ 3. , 0.25, 3.6 ],
# [ 4. , -4.1 , 1.3 ],
# [ 5. , 0. , -2. ]])
なお、values属性による変換は、データ型の違いによって得られる結果が異なる。
先ほどの例では全て数値型だったのでNumpy配列に変換できたが、下記のように文字列型が含まれるデータをvalues属性で変換すると、Pythonオブジェクトのndarrayに変換される。
df3 = data.copy()
df3['str'] = ['a', 'b', 'c', 'd', 'e']
# x0 x1 x2 str
# 0 1 0.01 -1.5 a
# 1 2 -0.01 0.0 b
# 2 3 0.25 3.6 c
# 3 4 -4.10 1.3 d
# 4 5 0.00 -2.0 e
df3.values
# array([[1, 0.01, -1.5, 'a'],
# [2, -0.01, 0.0, 'b'],
# [3, 0.25, 3.6, 'c'],
# [4, -4.1, 1.3, 'd'],
# [5, 0.0, -2.0, 'e']], dtype=object)
データフレームの列のうち、一部のみを使いたい場合はlocでインデックス参照をおこないながらvalues属性を使うと良い。
use_cols = ['x0', 'x2']
data.loc[:, use_cols].values
# array([[ 1. , -1.5],
# [ 2. , 0. ],
# [ 3. , 3.6],
# [ 4. , 1.3],
# [ 5. , -2. ]])
Numpy配列をデータフレームに戻す
逆に変換したNumpy配列をデータフレームに戻したい場合、データフレームにndarrayを渡し、列名を指定する。
df2 = pd.DataFrame(data.values, columns=['a', 'b', 'c'])
# a b c
# 0 1.0 0.01 -1.5
# 1 2.0 -0.01 0.0
# 2 3.0 0.25 3.6
# 3 4.0 -4.10 1.3
# 4 5.0 0.00 -2.0