Pythonで機械学習モデルを開発する場合、開発に先立ってpandasでデータの読み込みや整理をすることが多い。
生データからモデルに役立つ情報を抽出するためのデータの加工や分析をおこなうことを「特徴量エンジニアリング」と言う。
モデルの開発を進めると、必ず分析ライブラリを使用することになるが、この分析ライブラリとpandasデータの接点になるのがNumpy配列だ。
ライブラリによってはpandasをサポートしており、自動的にデータフレームをNumpy配列に変換してくれるが、それができない場合は手動で変換処理を行わなければならない。
データフレームのvalues属性を使ってNumpy配列に変換する
では早速、pandasのデータフレームをNumpy配列に変換する例を見ていこう。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 | 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属性を使うと良い。
1 2 3 4 5 6 | 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に変換される。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 | 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属性を使うと良い。
1 2 3 4 5 6 7 8 | 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を渡し、列名を指定する。
1 2 3 4 5 6 7 | 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 |