PythonのpandasモジュールのDataFrameを使うと、簡易的なデータベースを作ることができる。csvやhdfファイルで保存されたデータを読み込むこともできるため、非常に便利である。
以下は、DataFrameの定義の例である。
>>> import pandas as pd >>> df = pd.DataFrame({'name':['ichiro','jiro','saburo'],'age':[30,25,20]},index=['01','02','03'])
ここで、id、nameおよびageはキーであり、各キーに対するフィールド(列)を定義している。また、'01','02','03'は、各レコード(行)の索引(index)である。定義されたDataFrameを表示すると次のような表になっている。
>>> df age name 01 30 ichiro 02 25 jiro 03 20 saburo
このDataFrameから各フィールド(列)を参照するためには、次のようにキーで指定する。
>>> df['age'] 01 30 02 25 03 20 Name: age, dtype: int64 >>> df['name'] 01 ichiro 02 jiro 03 saburo Name: name, dtype: object
また、レコード(行)を参照するためには、ix、locおよびilocを使うことができる。
>>> df.ix['01'] age 30 name ichiro Name: 01, dtype: object >>> df.ix[0] age 30 name ichiro Name: 01, dtype: object >>> df.loc['01'] age 30 name ichiro Name: 01, dtype: object >>> df.iloc[0] age 30 name ichiro Name: 01, dtype: object
具体的には、ixは、ラベル('01', '02',および'03’)または通し番号(0,1,2)のどちらでもレコードを参照できるのに対し、locは、ラベルのみ、ilocは通し番号のみとなっている。一見、ixを使っていれば、特にlocやilocを使う必要はないように思えるが、ラベルが整数の場合は、ixはラベルしか使えなくなるというトリックがある。その場合は、loc(ラベル)とiloc(通し番号)で使い分けた方がよい。例えば次のような場合である。
>>> df = pd.DataFrame({'name':['ichiro','jiro','saburo'],'age':[30,25,20]},index=['01','02','03']) >>> df.ix[0] KeyError: 0 >>> df.loc[1] age 30 name ichiro Name: 1, dtype: object >>> df.iloc[1] age 25 name jiro Name: 2, dtype: object
上記のように、ix[0]ではKeyErroが発生する。loc[1]は、ラベル1の1行目のレコードを参照し、iloc[1]は、通し番号1の2行目のレコードを参照している。
次に、DataFrameへの行及び列の追加は、Seriesを用いると簡単に出来る。
例えば、行の追加は、次のようになる。
>>> d=pd.Series(['shro',25],index=['name','age'],name='04') >>> df=df.append(d) >>> df age name 01 30 ichiro 02 25 jiro 03 20 saburo 04 25 shro
また、例えば、列の追加は、次のようになる。
>>> d=pd.Series([175,173,170,165],index=['01','02','03','04'],name='height') >>> df.T.append(d).T age name height 01 30 ichiro 175 02 25 jiro 173 03 20 saburo 170 04 25 shro 165 >>> pd.concat([df,d],axis=1) age name height 01 30 ichiro 175 02 25 jiro 173 03 20 saburo 170 04 25 shro 165
これまでは、既に値が入っているdataframeを扱っていたが、以下のようにすれば、まず空のdataframeを作り後から行を追加していくことができる。
>>> df = pd.DataFrame(columns=['sentence','score','predict']) >>> d = pd.Series(['Good, works fine',1,0],index=df.columns) >>> df = df.append(d, ignore_index=True) >>> df = df.append(d, ignore_index=True) >>> df = df.append(d, ignore_index=True) >>> df sentence score predict 0 Good , works fine. 1 0 1 Good , works fine. 1 0 2 Good , works fine. 1 0