データフレームの行列アクセスで少しわかったこと。

まずはデータフレーム。 index/columnsにの設定が何もない、数字の時。

In [3]: df = pd.DataFrame([(1,2),(3,4)])

In [4]: df
Out[4]:
   0  1
0  1  2
1  3  4

In [5]: df.ix[0,1]
Out[5]: 2

In [6]: df.iloc[0,1]
Out[6]: 2

In [7]: df.loc[0,1]
Out[7]: 2

全部動きが一緒。

で、columnsに値を設定すると、、

In [8]: df.columns = list(ab)

In [9]: df
Out[9]:
   a  b
0  1  2
1  3  4

In [10]: df.ix[0,1]
Out[10]: 2

In [11]: df.iloc[0,1]
Out[11]: 2

In [12]: df.loc[0,1]
KeyError: the label [1] is not in the [index]

で .loc はエラーを吐く。

ix/ilocはcolumns(名)でなくて、columns(数)でアクセスする。 .locは(名前)でアクセス。

なので、

In [14]: df.loc[0,a]
Out[14]: 1

だとOK。

あと、データフレームのスライスは、 df[row側,col側]となる。

例、

In [18]: df
Out[18]:
   0  1  2
0  1  2  3
1  4  5  6
2  7  8  9

In [20]: df.ix[0:1,0:1]
Out[20]:
   0  1
0  1  2
1  4  5

In [21]: df.iloc[0:1,0:1]
Out[21]:
   0
0  1

In [23]: df.ix[:,0:1]
Out[23]:
   0  1
0  1  2
1  4  5
2  7  8

In [24]: df.iloc[:,0:1]
Out[24]:
   0
0  1
1  4
2  7

.ixは index番号を参照。 .ilocはスライスの箇所を参照しているっぽいね。

[:,:]

がrow全部、column全部を選択。なので、

In [35]: df.ix[:,:]
Out[35]:
   0  1  2
0  1  2  3
1  4  5  6
2  7  8  9

となる。

仕様書

だいぶ分かって気がしてきた。。。