pythonでのデータサイエンスのお供、pandasでの要素指定の仕方
背景
たまにはちゃんとコードを書く系の内容も。pandasでdataframeの指定をするところでいろいろと混乱してしまって無駄に時間がかかった。整理するがてらにまとめたいと思う。pandasビギナーがまとめたものなので、間違ってたりもっといいまとめがあるならばアドバイスくれればと思います。
それぞれのversionは以下のとおり。
pandas (0.18.1) numpy (1.11.0) Python 2.7.10
3つの要素指定の方法
pandasのDataFrameでの要素の指定の仕方は3つ。
- df[ a ]
- df.loc[ a, b ]
- df.iloc[a, b]
前提とするDataFrameは10minites to pandasを参考に以下のコードで作成した。
dates = pd.date_range('20130101', periods=6) df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
できたDataFrameはこんな感じ。
A B C D 2013-01-01 -0.682002 1.977886 0.348623 0.405755 2013-01-02 0.085698 2.067378 -0.356269 1.349520 2013-01-03 0.058207 -0.539280 0.023205 1.154293 2013-01-04 -0.319075 1.174168 -1.282305 0.359333 2013-01-05 -2.557677 0.922672 0.202042 0.171645 2013-01-06 1.039422 0.300340 0.701594 -0.229087
df[ a ]型の指定方法
指定の仕方で行方向だったり、列方向だったりに処理ができるっぽい。
#単独のカラム(列)を指定 df[‘A’] # カラム名 = A を指定 df.A # 同上 #行方向のスライス:df[ 0:3 ] df[0:3] # 0行目から3行目まで指定 df[‘20130102’:’20130104’] # インデックスが2013-01-02~2013-01-04 までを指定
インデックス・カラムのラベル名で指定する -> locメソッド
指定する引数(って呼んでいいのかな?)の1つ目がインデックスに対する操作、2つ目がカラムに対する操作。
# 該当するインデックスの取得 # A 0.469112 # B -0.282863 # C -1.509059 # D -1.135632 # Name: 2013-01-01 00:00:00, dtype: float64 df.loc[dates[0]] # インデックス・カラムを同時に指定する。 # A B # 2013-01-01 0.469112 -0.282863 # 2013-01-02 1.212112 -0.173215 # 2013-01-03 -0.861849 -2.104569 # 2013-01-04 0.721555 -0.706771 # 2013-01-05 -0.424972 0.567020 # 2013-01-06 -0.673690 0.113648 df.loc[:, [‘A’, ‘B’]] # インデックスをインデックス名で取得する # A B # 2013-01-02 1.212112 -0.173215 # 2013-01-03 -0.861849 -2.104569 # 2013-01-04 0.721555 -0.706771 df.loc[‘20130102’:’20130104’, [‘A’, ‘B’]] # カラムを複数指定する時は、リストで渡す # 一個だけ指定する場合は、loc よりも at を使ったほうが早い #0.46911229990718628 df.at[dates[0],'A']
インデックス・カラムの位置番号で指定する
行列に置き換えた時の要素の位置で指定する方法。これももちろん、複数選択できる。
# インデックスの位置で指定(今回は3行目) # A 0.721555 # B -0.706771 # C -1.039575 # D 0.271860 # Name: 2013-01-04 00:00:00, dtype: float64 df.iloc[3] # インデックス / カラム の同時指定(ここでは3〜4行、0〜1列目) # A B #2013-01-04 0.721555 -0.706771 #2013-01-05 -0.424972 0.567020 df.iloc[3:5,0:2] # とびとびの特定の要素を指定 # A C # 2013-01-02 1.212112 0.119209 # 2013-01-03 -0.861849 -0.494929 # 2013-01-05 -0.424972 0.276232 df.iloc[[1,2,4],[0,2]]
慣れるしかない!