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')