Python
pandas

Pandas で Multi-Index の特定のレベルの値を取得する

いつも忘れてしまうのでメモ。

やりたいこと

例えば以下のような Multi-Index な Pandas DataFrame があったとする。

import pandas as pd
from itertools import product

keys = ['key1', 'key2']
df = pd.DataFrame(list(product(list('ABC'), list('DEF'))), columns=keys).set_index(keys)
df['val'] = None

ここで「key1A の行だけフィルタリングしたい」という場合、どうすればいいか。

解決策

pandas.MultiIndex.get_level_values というメソッドを使うと、Multi-Index の値にアクセスできる。

df.index.get_level_values('key1')  #=> Index(['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'], dtype='object', name='key1')

フィルタリングする場合はこう。

df[df.index.get_level_values('key1') == 'A']

[追記] 補足

フィルタリングするだけなら .loc にタプル渡すだけでもできた。

df.loc[('A',)]

参考