ilocとixの違い

データフレーム形式で要素にアクセスしたいことがある。

その場合、df.ix[i,j]という書き方とdf.iloc[i,j]という書き方があるが、
df.ixはあくまでインデックスを頼りに参照しに行っているのに対し、
ilocは(インデックスとは別に)何行目なのかを頼りにして参照しに行く。

例えば、

#Data generation
df = pd.DataFrame(np.arange(12).reshape((3, 4)), index=[1,2,3], columns=list("abcd"))

df
Out[8]: 
   a  b   c   d
1  0  1   2   3
2  4  5   6   7
3  8  9  10  11

#ilocの場合
df.iloc[1,1] #5

#ixの場合
df.ix[1,1] #1

となる。

つまり、ilocの場合には(i,j)と指定すると(i+1,j+1)が返ってくる(内部でのインデックスは0から始まるため)。

一方でixの場合には、(i,j)のうちiについてはインデックスを参照し、jについては(j+1)列を参照することになる。列のほうはilocと同じ取扱い。

dfの一部を除いて新しいデータフレームを作成してもインデックスは同じ番号のものが抜き出される。たとえば、

#a列が8のものを抜き出す、すなわちindex=3が抜き出される
In[10]: df2=df[df['a']==8]

Out[11]: 
   a  b   c   d
3  8  9  10  11

こういう場合、ilocでは新しいデータフレームに対して何行目かということだけを考えれば使えるが、ixだとどのインデックスが保たれているのかということを考えて指定する必要がある。たとえば10を呼び出したい場合、

df2.ix[3,2]
df2.iloc[0,2]

と指定すれば良い。