.ixは非推奨に
pandasのDataFrameを参照する際に何かと便利な.ix
ですが、理解していないと罠にはまります。
例えば下記のようなDataFrameがあったとします。
from pandas import DataFrame
df = DataFrame(
[['a0', 'b0'], ['a1', 'b1'], ['a2', 'b2']],
index=[2, 4, 6],
columns=['a', 'b'])
a | b | |
---|---|---|
2 | a0 | b0 |
4 | a1 | b1 |
6 | a2 | b2 |
ここで2番目(0から開始して)の行
のa列
を参照したい場合、どのようにすればよいでしょうか?期待する結果はa2
です。
.ix
は順序もインデックスも受け付けるので、下記のように参照すると・・・
df.ix[2, 'a']
結果はa0
が返ってきます。
これは.ix
で数値を与えた場合の参照がインデックスが存在する場合にはインデックスを、インデックスに存在しない場合は順序を見に行っているからです。
このように.ix
の参照には曖昧さがあるため、pandasのバージョン0.20では非推奨となるようです。
順序とインデックス名を同時に参照するには
ベストな解ではないかもしれませんが、.iloc
による参照をしてみます。
ただし、これでは順序による参照しかできないため、pandas.Index.get_locを併用します。
これは行名(または列名)を検索し順序を返すメソッドです。
df.iloc[2, df.columns.get_loc('a')]
期待する結果であるa2
が返ってくるようになりました。
上記の例では列名を指定していましが、行の名前を指定する場合には下記のようにします。
df.iloc[df.index.get_loc(6), 0]
行と列の名前が事前にわかっている場合は普通に.loc
を使えば問題ありません。
df.loc[6, 'a']
同様に、行と列の順序が事前にわかっている場合は.iloc
で大丈夫です。
df.iloc[2, 0]
まとめ
.ix
の挙動を理解していないと意図しない動作をします。
例え挙動を理解していても、インデックスの中身を把握している必要があるため、.ix
を使用するのは極力避けた方がよさそうです。