LoginSignup
9
11

More than 5 years have passed since last update.

pandasのDataFrameで.locと.ilocを同時に参照する

Last updated at Posted at 2017-01-19

.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を使用するのは極力避けた方がよさそうです。

9
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
11