1. ホーム
  2. python

[解決済み] Pandasです。MultiIndexのレベル値をラベルで一意に取得する

2023-08-05 18:24:24

質問

MultiIndex化されたDataFrameがあるとします。

df = pd.DataFrame({'co':['DE','DE','FR','FR'],
                   'tp':['Lake','Forest','Lake','Forest'],
                   'area':[10,20,30,40],
                   'count':[7,5,2,3]})
df = df.set_index(['co','tp'])

というのは、こんな感じです。

           area  count
co tp
DE Lake      10      7
   Forest    20      5
FR Lake      30      2
   Forest    40      3

私は インデックスレベルごとにユニークな値を取得する . これは、次のようにして実現できます。

df.index.levels[0]  # returns ['DE', 'FR]
df.index.levels[1]  # returns ['Lake', 'Forest']

私なら 本当に によってこれらのリストを取得することです。 レベルを名前で指定する で、つまり 'co''tp' . 最も短い2つの方法は、次のようになります。

list(set(df.index.get_level_values('co')))  # returns ['DE', 'FR']
df.index.levels[df.index.names.index('co')]  # returns ['DE', 'FR']

しかし、どれもあまりエレガントではありません。もっと短い方法はないのでしょうか?

どのように解決するのですか?

Pandas 0.23.0がリリースされました。 導入 を使うことで、この問題に対してよりクリーンな解決策を提供します。 level への引数です。 Index.unique() :

In [3]: df.index.unique(level='co')
Out[3]: Index(['DE', 'FR'], dtype='object', name='co')

これは現在推奨されている解決策です。メモリ内にレベル値の完全な表現を作成し、それを再スキャンすることを避けることができるため、はるかに効率的です。