覚え書きブログ

Pythonの覚え書き(pandasのDataFrame編)

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