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を利用している。)
referenced URL:
http://sinhrks.hatenablog.com/entry/2014/11/12/233216