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