目次 †
はじめに †
pandasはデータ分析支援ライブラリーです。
Pythonでデータ分析をするときに、機械学習の部分はscikit-learnでやりますが、機械学習のための前処理をするときに、pandasを使うととても便利です。
参考書としては、次の本がオススメです。
ライブラリーの読み込み †
pandasのライブラリー名は pandas です。 ここでは、以後、pd とします。
import pandas as pd
シリーズとデータフレーム †
pandasの基本は、シリーズ (Series) とデータフレーム (DataFrame) と呼ばれるデータ構造です。
シリーズは、(一次元)配列にインデックスが付いたもので、pandas.Seriesクラスのオブジェクトとして表されます。
データフレームは、二次元配列の行と列にインデックスが付いたもので、pandas.DataFrameクラスのオブジェクトとして表されます。
データフレームの列をシリーズとして取り出すことができますので、シリーズも使わないことはありませんが、データ分析するためにはデータフレームを理解することが重要です。
CSVファイルからデータフレームを作る †
データ分析をするときはデータをファイルから読み込むことになりますが、pandasには、read_csv関数というCSVファイルを読み込んでデータフレームを作ってくれる関数があります。
例えば、次のような data.csv という名前のCSVファイルを考えてみましょう。
,X1,X2,X3,Y 1,t,1.0,1.2,+ 2,t,0.9,0.8,- 3,f,0.9,1.1,+ 4,f,0.8,1.0,-
これを読み込んでデータフレームを作るには、次のようにread_csv関数を使います。
df = pd.read_csv('data.csv', index_col=0)
index_colオプションは、行(データ)のインデックスを表す列番号を指定します。
すると、見出し(インデックス)付きの表の形になります。
df
X1 | X2 | X3 | Y | |
1 | t | 1.0 | 1.2 | + |
---|---|---|---|---|
2 | t | 0.9 | 0.8 | - |
3 | f | 0.9 | 1.1 | + |
4 | f | 0.8 | 1.0 | - |
変数の型を調べる †
変数の型は、データフレーム・オブジェクトのdtypes属性に格納されています。
df.dtypes
X1 object X2 float64 X3 float64 Y object dtype: object
変数の型を変換する †
scikit-learnはnumpy.ndarrayでデータを扱いますが、numpy.ndarrayは配列なので、要素の型が全て同じでなければなりません。 これに対し、pandasでは、説明変数ごとに型推定を行い、それぞれの変数を適当な型で表現します。 特に、文字列を含む型はobject型になります。
scikit-learnを使うには、pandasにおいて説明変数を取り出す前に、astype関数を用いて、変数を同じ型にしておく必要があります。
カテゴリーを表す文字列をカテゴリー番号に変換する †
カテゴリーを表す文字列が格納されている列の型をカテゴリー番号に変換するには、まず、astype関数に 'category' を指定して変数をカテゴリー型に変換し、そのcat属性のcodes属性を取得します。
df.X1.astype('category').cat.codes
1 0 2 0 3 1 4 1 dtype: int8
そこで、データフレームをコピーし、カテゴリーを表す変数を置き換えます。
df_cat = df df_cat.X1 = df.X1.astype('category').cat.codes df_cat.dtypes
X1 int8 X2 float64 X3 float64 Y object dtype: object
カテゴリーを表す文字列をダミー変数に変換する †
カテゴリーを表す文字列が格納されている列の型をダミー変数に変換するには、pandas.get_dummies関数を使います。
df_dum = pd.get_dummies(df) df_dum
X1_t | X1_t | X2 | X3 | Y | |
1 | 1 | 0 | 1.0 | 1.2 | + |
---|---|---|---|---|---|
2 | 1 | 0 | 0.9 | 0.8 | - |
3 | 0 | 1 | 0.9 | 1.1 | + |
4 | 0 | 1 | 0.8 | 1.0 | - |
このように、カテゴリーごとにダミー変数が用意され、そのカテゴリーに属するときは値が 1、そうでないときは値が 0 になります。
データフレームから説明変数を取り出す †
データフレームから説明変数を取り出すには、データフレームのdrop関数を使って目的変数を取り除きます。 説明変数はscikit-learnにnumpy.ndarrayで渡しますので、values属性に格納されている配列を取り出します。
X = df.drop('Y', axis=1).values
drop関数は、行と列、どちらを取り除くのにも使えるので、列を取り除く時にはaxisオプションを 1 に指定します。
データフレームから目的変数を取り出す †
データフレームから目的変数を取り出すには、目的変数の列のインデックスを指定します。 目的変数もscikit-learnにnumpy.ndarrayで渡しますので、values属性に格納されている配列を取り出します。
y = df['Y'].values