2012-12-15 57 views
35

我知道我可以通過重置索引來獲取DataFrame的唯一值,但有沒有辦法避免這一步並直接獲取唯一值?從MultiIndex索引列中獲取唯一值

鑑於我:

 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']) 

有建於大熊貓的方式做到這一點?

+0

我不明白你的例子。 uniq_b沒有被使用? –

+0

啊,我想我明白了。你只想'知道'B的獨特價值。 –

+0

如果可能的話,我認爲你應該考慮把接受的答案改爲8one6。 – KobeJohn

回答

30

一種方法是使用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) 
+0

適合我。謝謝! – seth

+1

這是一個很好的答案,但它在一些特定情況下有一些非常奇怪的行爲。請看下面的答案,以避免這些問題。 – 8one6

+0

這對我不起作用。索引不再具有屬性級別。這是更新嗎? – eleijonmarck

28

安迪·海登的答案(index.levels[blah])是偉大的一些場景,但會導致其他奇怪的行爲。我的理解是,熊貓在儘可能「重複使用」索引時儘量避免使用大量類似索引的數據幀索引佔用內存空間。其結果是,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() 

我希望這可以幫助別人躲避我遇到的超級意外的行爲。

+0

FWIW,這是如果試圖模仿R的預期行爲。在R中,因子變量的水平(看起來很像熊貓中的指數)在子集化時不會改變。必須明確重新索引以縮小可能的水平。 –