50

インデックスをリセットすることで a の一意の値を取得できることはわかっていますが、DataFrameこの手順を回避して一意の値を直接取得する方法はありますか?

私が持っているとすれば:

        C
 A B     
 0 one  3
 1 one  2
 2 two  1

できます:

df = df.reset_index()
uniq_b = df.B.unique()
df = df.set_index(['A','B'])

これを行うためにパンダに組み込まれた方法はありますか?

4

3 に答える 3

44

1つの方法は使用することindex.levelsです:

In [11]: df
Out[11]: 
       C
A B     
0 one  3
1 one  2
2 two  1

In [12]: df.index.levels[1]
Out[12]: Index([one, two], dtype=object)
于 2012-12-15T01:46:22.580 に答える
43

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()

これが、私が遭遇した非常に予期しない動作を他の誰かが回避するのに役立つことを願っています.

于 2014-06-30T11:38:56.107 に答える