pandas@python

概要

  • pandasというのをよく目にする.Rっぽくデータ処理するためのライブラリみたいだ.
  • DataFrameに2次元配列を渡してデータを生成する.タプルの配列や,ハッシュ配列でも行ける.
  • 行はindex, 列はcolumnsで名前を付ければ,名前でアクセス可能.行は意味が無いなら名前つけない.その方がスライシングが分かりやすい.
  • ix[row, col]でアクセスするのが一番汎用性が高い.
  • 連結はjoinするような場合以外はconcatが柔軟で良い.
  • CSVは特に悩むところはないのでWeb参考にする.
import pandas as pd

##############################
# data setting
## from array (numpy array is also o.k.)
df = pd.DataFrame( [[0,1,2], [3,4,5], [6,7,8], [9,10,11]] ) # 4x3 table
df.columns = ['c0', 'c1', 'c2']
df.index = ['r0', 'r1','r2','r3']
df.shape   #=> (4,3)

## from array of hash
### The 'NaN' is filled automatically
# c0  c1  c2
# 1   2   nan
# nan 1   2
# 2   nan 1
df1 = pd.DataFrame( [{'c0':1, 'c1':2}, {'c1':1, 'c2':2}, {'c0':1, 'c2':2}] )

##############################
# row/column process
## reference
df[1:3]          # row slicing
df['c0']         # column exraction
df[['c0', 'c1']] # multi column extraction
df.ix[:,:]       # ix[row, col] 
## filter
df['c0'] > 0     # [False, True, True, True]
df[df['c0'] > 0] # filter by the above boolean array
## add/delete row/column
df['c3'] = [6,6,6,6]        # add column
print df.drop('c3', axis=1) # delete column(non-destructive)

##############################
# NaN process (non-destructive)
df1.fillna(0)      # NaN->0 
df1.interpolate()  # interpolatraion
df1.dropna(axis=0) # axis=0:row, axis=1 column 
print df1

データフレームの生成

  • 配列の配列として渡すと,行と列が逆になってしまう,などがあって,そのたびに調べてしまう。個人的に一番覚えやすいのは,下記の例のように辞書として渡す方法。これだと,列がキーになって明確。下の例はキーが'x', 'y'の列が出来る。
x = [1, 2, 3]
y = ['a', 'b', 'c']
df = pd.DataFrame({'x': x, 'y': y})

多重のソート

  • あるキーでソートして,その結果の中で別のあるキーでソートする,と言う場合。ソートしたいキーをリストで渡すだけ。便利だ。
import pandas as pd

x = [1, 3, 1, 2, 2]
y = [5, 1, 2, 4, 3]
names = list('abced')
df = pd.DataFrame({'x':x, 'y':y, 'name':names})
df.sort_values(['x'])
df.sort_values(['x', 'y'])

よくハマること

文字列の数値への変換

  • apply(pd.to_numeric, args=('coerce',))だと変換できなかったセルにはNaNが入る.で.それに気付かずにdropnaすると行全体がドロップしてしまう.
  • convert_objects(convert_numeric=True)だとそれはないんだけど,古いAPIだぞ,ってワーニングが出る.

dropnaに関して

  • dropnaするとインデックスが歯抜けになる.それを忘れて,乱数でアクセス行を作ってサンプリングしちゃうとNaNな行にアクセスしてしまう.

コピーに関して

  • データフレームの代入は浅いコピーがされる.つまりdf=df_orgとかして,dfをいじるとdf_orgも弄られてしまうので注意.