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