首页 文章

从MultiIndex中的索引列获取唯一值

提问于
浏览
40

我知道我可以通过重置索引获得 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'])

大熊猫有没有办法做到这一点?

2 回答

  • 33

    Andy Hayden的答案( index.levels[blah] )对于某些场景非常有用,但可能导致其他场景中的奇怪行为 . 我的理解是,在可能的情况下,Pandas竭尽全力避免使用大量类似索引的DataFrame的索引占用内存空间 . 结果,I've found the following annoying behavior

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

    我希望这有助于其他人躲避我遇到的超意外行为 .

  • 33

    一种方法是使用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)
    

相关问题