<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
下記、教科書。