Andy Hayden の回答 ( index.levels[blah]
) は、一部のシナリオでは優れていますが、他のシナリオでは奇妙な動作につながる可能性があります。私の理解では、パンダは可能な限りインデックスを「再利用」して、同様にインデックス付けされた多数の DataFrames のインデックスがメモリ内のスペースを占有するのを避けるために多大な努力を払っているということです。その結果、次の迷惑な動作が見つかりました。
import pandas as pd
import numpy as np
np.random.seed(0)
idx = pd.MultiIndex.from_product([['John', 'Josh', 'Alex'], list('abcde')],
names=['Person', 'Letter'])
large = pd.DataFrame(data=np.random.randn(15, 2),
index=idx,
columns=['one', 'two'])
small = large.loc[['Jo'==d[0:2] for d in large.index.get_level_values('Person')]]
print small.index.levels[0]
print large.index.levels[0]
どの出力
Index([u'Alex', u'John', u'Josh'], dtype='object')
Index([u'Alex', u'John', u'Josh'], dtype='object')
予想よりも
Index([u'John', u'Josh'], dtype='object')
Index([u'Alex', u'John', u'Josh'], dtype='object')
ある人が他のスレッドで指摘したように、非常に自然で適切に機能するイディオムは次のとおりです。
small.index.get_level_values('Person').unique()
large.index.get_level_values('Person').unique()
これが、私が遭遇した非常に予期しない動作を他の誰かが回避するのに役立つことを願っています.