いつも忘れてしまうのでメモ。
やりたいこと
例えば以下のような 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
ここで「key1
が A
の行だけフィルタリングしたい」という場合、どうすればいいか。
解決策
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',)]