はじめに
この記事を見て、タイトルの動作ををしようとした時にハマったので、メモしておきます。
解決はしましたが、根本的なメカニズムを理解できていないので、詳しい方がいたらご教授ください。
やりたいこと
MultiIndexのDataFramedf
から、Index2 == 'abc'
のものだけ取得する。
Index1 | Index2 | Content |
---|---|---|
A | abc | A_abc |
B | de | B_de |
C | abc | C_abc |
D | de | D_de |
E | abc | E_abc |
F | de | F_de |
解決方法
df.loc[(slice(None), 'abc' ), :]
または
df.loc[pd.IndexSlice[:, 'abc'], :]
詳細はこちらの記事を参考にしてください。
できなかった方法
Pandasのloc[]
では後ろの:
を省略できるため、通常この2つは同じ動作をします。
df.loc['C']
df.loc['C', :]
ところが、今回:
を省略したところエラーが発生。
df.loc[(slice(None), 'abc' )] # KeyError: 'abc'
df.loc[pd.IndexSlice[:, 'abc']] # KeyError: 'abc'
ちなみに、これは問題なく実行できました。
df.loc[(slice(None), 'abc' ), ]
df.loc[pd.IndexSlice[:, 'abc'], ]
エラーの理由がイマイチよく分かっていないので、知っている方がいれば教えていただけると助かります。
参考
- pandasのMultiIndexから任意の行・列を選択、抽出(note.nkmk.me)