<Python, pandas> .ix の挙動

.ixの動き。 ちとトリッキーだったのでメモメモ。

.ixは、データフレームDataFrameのデフォルトで設定されるindexの値をラベル(index name)として認識して処理する。
なので、ぱっと見indexには数字が入っているがそれは数字(index number)として処理されない。 ラベル(index name)として処理。
.ixで数字を指定すると、indexの値は数字(number)でなく、ラベル(name)として処理される。

かたや、
indexに数字以外の値が入っていて、.ixで数字を指定すると、index numberで処理される。

例。まずはデータフレーム作成。
dfはデフォルト。
df1はデフォルトに加えてindexの値をアルファベットに書き換え。

In [160]: df = pd.DataFrame({
     ...: 'a':[10,11,12,13,14,15],
     ...: 'b':[20,21,22,23,24,25],
     ...: 'c':[30,31,32,33,34,35],
     ...: 'd':[40,41,42,43,44,45],
     ...: 'e':[50,51,52,53,54,55],
     ...: })

In [161]: df1 = df.copy()

In [162]: df1.index=list('abcedf')

In [163]: df
Out[163]: 
a b c d e
0 10 20 30 40 50
1 11 21 31 41 51
2 12 22 32 42 52
3 13 23 33 43 53
4 14 24 34 44 54
5 15 25 35 45 55

In [164]: df1
Out[164]: 
a b c d e
a 10 20 30 40 50
b 11 21 31 41 51
c 12 22 32 42 52
e 13 23 33 43 53
d 14 24 34 44 54
f 15 25 35 45 55

Rowのスライスはdf/df1とも同様に結果が返ってくる。

In [165]: df[0:2]
Out[165]: 
a b c d e
0 10 20 30 40 50
1 11 21 31 41 51

In [166]: df1[0:2]
Out[166]: 
a b c d e
a 10 20 30 40 50
b 11 21 31 41 51

が、.ixで数値を指定すると、、
dfは3行分返ってくるが
df1は2行分返ってくる。

違いは、dfの方は、indexの数字をラベル(index name)として認識。 かたや、df1の方は indexが数字でないので、index number(index nameの裏に隠れている番号)で処理。 つまりスライス。

In [167]: df.ix[0:2]
Out[167]: 
a b c d e
0 10 20 30 40 50
1 11 21 31 41 51
2 12 22 32 42 52

In [168]: df1.ix[0:2]
Out[168]: 
a b c d e
a 10 20 30 40 50
b 11 21 31 41 51

その他の指定。ラベル(index name)で指定すれば、下記のように返ってくる。

In [169]: df1.ix['a':'c']
Out[169]: 
a b c d e
a 10 20 30 40 50
b 11 21 31 41 51
c 12 22 32 42 52

In [170]: df1.loc['a':'c']
Out[170]: 
a b c d e
a 10 20 30 40 50
b 11 21 31 41 51
c 12 22 32 42 52

おまけ、ilocはindex numberで動く。

In [171]: df1.iloc[0:2]
Out[171]: 
a b c d e
a 10 20 30 40 50
b 11 21 31 41 51

下記、教科書。

Indexing and Selecting Data — pandas 0.16.2 documentation