pandasの基本操作

  • 9
    いいね
  • 0
    コメント

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.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