Edited at

pandasの基本操作

More than 1 year has passed since last update.


pandasについて

pandasはnumpyを基にしたデータ操作なので,numpyの操作がそのまま使えるので便利.ただ,馴れるまで行・列の取り出した方法が分かりにくい.まだまだ不馴れなので,記しておく.


DataFrameとSeries

pandasにはDataFrameとSeriesの2種類のデータ形式がある.前者は二次元データ,後者は一次元データである.基本的に,Seriesは使うことがあまり無いので,DataFrameを中心に説明する.DataFrameから一つのcolumnを指定して取り出した場合,それはSeries型となる.

# DataFrame

foo bar
a 0 1
b 2 3
c 4 5

# Series
a 0
b 2
c 4


DataFrameの操作


indexとcolumn

DataFrameには,要素の位置情報として,n行目m列目といったnumpyのような要素番号と,indexとcolumnによるユーザー定義の要素指定が可能である.

特に指定しなければ,番号が割り当てられるが,そのような使い方ではnumpyと変わらないので,実用上は使われないような.個人的には,indexは番号で良いかという気もする.


indexとcolumnsの指定

indexとcolumnsを指定する場合は以下のようにすればよい.

df.columns = ['foo', 'bar']

df.index = ['a', 'b', 'c']

また,DataFrameのindexやcolumns名を確認する場合は以下のように.

df.columns

df.index
df.info() # columns, index, memory usage


最もシンプルな列の抽出

DataFrameでは,__getitem__の取り方での指定は,columnsの指定である.また,列番号でも取り出せるが,その場合は単一でもリスト型で指定する必要がある.ただ,この方法ではindexの行番号(index)の指定は出来ない.

Seriesの場合は,__getitem__でindex指定となる.columnsが一つしかないから自然だが.

df['foo'] or df[[0]]  # designate single column

df[['foo', 'bar']] or df[[0, 1]] # designate multi columns


より詳細な抽出(ix, iloc, loc)

DataFrame上の要素の位置情報として,行列の要素番号とユーザー定義の名前があると上述した.どちらで取り出しているのかを明示するために,ix,iloc,locの3種類がある.

ilocは番号の指定のみに対応,locは名前のみ,ixは両方で指定可能である.上の例を取れると,[0,0]を取りたい場合は,以下のように書ける.

df.ix[[0], [0]]

df.ix[[0], ['foo']]
df.ix[['a'], ['foo']]
df.ix[['a'], [0]]
df.iloc[[0], [0]]
df.loc[['a'], ['foo']]

因みに,複数のインデックスを指定する場合は以下のようにすれば良い.

df.ix[:, [0]]   # 全て

df.ix[1:5, [0]] # 範囲指定
df.ix[:] # indexのみの指定


指定条件からの行・列の抽出


行の抽出

指定列の中からある条件を満たす行を抽出する方法。その列のすべての列が出力される。

print foo.loc[foo['bar'] == condition]


列の抽出

間接的な方法で、条件を満たさない要素をNaNにして、続いてNaNを含む列を削除する。

foo = foo[foo == 1] # 条件を満たさない要素はすべてNaNになる。

foo = foo.dropna(axis=1)


イテレータ

pd.DataFrameの各列に対してイテレートする場合。

for index, rows in df.iterrows():

print index, rows # rows: pd.DataFrameとなっている。


pd.DataFrameを作成・編集する.

# 器だけ作成する場合

foo = pd.DataFrame(columns=['bar', 'baz'])

foo = pd.DataFrame({'bar': [0, 1, 2],
'baz': [3, 4, 5]}
index=['a', 'b', 'c'])
# foo
bar baz
a 0 3
b 1 4
c 2 5


列を追加する

列を新たに追加する方が行を追加するよりも簡単.

foo['qux'] = [6, 7, 8]

# foo
bar baz qux
a 0 3 6
b 1 4 7
c 2 5 8


行を追加する

foo = foo.append(pd.DataFrame({'bar': [6, 7], 'baz': [8, 9]}, index=['d', 'e']))

# foo
# indexを修正したければ自分で指定する必要がある。
bar baz
a 0 3
b 1 4
c 2 5
d 6 7
e 8 9


行および列を削除する。

foo.drop('e')

foo.drop('bar', axis=1) # 列を削除する。
del foo['bar'] # 列を削除する。(pythonのdelを利用している。)

参考URL

http://stackoverflow.com/questions/17071871/select-rows-from-a-dataframe-based-on-values-in-a-column-in-pandas

referenced URL:

http://sinhrks.hatenablog.com/entry/2014/11/12/233216