ix,loc,ilocによるデータフレームのアクセス:Pandas

ix,loc,ilocは何が違うのか?こいつらを使ってスクリプトを書いたのですが,やや気づきにくい不具合があり,苦戦しました.そんなときに下記のブログに参考にして直しましたが,自分でも試行錯誤したので,その一部を記録しておきます.

リンク先にも書いてありますが,「ちょこっと試すなら.ixを使って,長く使うなら iloc, loc が安全」かと.

列に名前がついて無い場合

ixもilocもloc同じ挙動

In [2]: import pandas as pd

In [20]: df = pd.DataFrame(
    ...:         [(10, 11, 12, 13),
    ...:          (20, 21, 22, 23),
    ...:          (30, 31, 32, 33)])

In [21]: df
Out[21]: 
    0   1   2   3
0  10  11  12  13
1  20  21  22  23
2  30  31  32  33

In [22]: df.ix[1,1]
Out[22]: 21

In [23]: df.loc[1,1]
Out[23]: 21

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

列に名前(str)がついている場合

ixとilocは番号指定出来る.locは番号指定出来ない


In [7]: df = pd.DataFrame(
   ...:     {'C1': [10, 11, 12, 13],
   ...:      'C2': [20, 21, 22, 23],
   ...:      'C3': [30, 31, 32, 33]})

In [8]: df
Out[8]: 
   C1  C2  C3
0  10  20  30
1  11  21  31
2  12  22  32
3  13  23  33

In [9]: df.ix[1,1]
Out[9]: 21

In [10]: df.loc[1,1]
# これはエラー

In [11]: df.loc[1,'C2']
Out[11]: 21 # 列名を指定すればOK

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

列に名前(int)がついている場合

ixだと列名の方を優先するみたいです.

In [37]: df = pd.DataFrame(
    ...:     {5: [10, 11, 12, 13],
    ...:      3: [20, 21, 22, 23],
    ...:      1: [30, 31, 32, 33]})

In [38]: df
Out[38]: 
    1   3   5
0  30  20  10
1  31  21  11
2  32  22  12
3  33  23  13

In [39]: df.ix[1,1]
Out[39]: 31

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

In [41]: df.columns
Out[41]: Int64Index([1, 3, 5], dtype='int64')