2012-12-15 20 views
35

'daki dizin sütunundan benzersiz değerler edinin Dizini sıfırlayarak DataFrame'un benzersiz değerlerini alabildiğimi biliyorum, ancak bu adımı önlemek ve benzersiz değerleri doğrudan elde etmek için bir yol var mı?MultiIndex

Ben Verilen:

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

Yapabileceğim: Bunu yapmak için pandalar inşa edilmiş bir yolu

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

var mı?

+0

Örneğini anlamıyorum. uniq_b kullanılmıyor mu? –

+0

ah, sanırım anladım. Sadece B'nin eşsiz değerlerini 'bilmek' istediniz. –

+0

Eğer mümkün değilse, kabul edilen cevabı 8'e6 değiştirmeyi düşünmelisiniz. – KobeJohn

cevap

30

Tek yön index.levels kullanmaktır:

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

Benim için çalışıyor. Teşekkürler! – seth

+1

Bu iyi bir cevaptır, ancak birkaç özel durumda bazı tuhaf davranışları vardır. Bu sorunları önlemek için aşağıdaki cevaba bir göz atın. – 8one6

+0

Bu benim için çalışmıyor. Dizin artık özellik seviyelerine sahip değil. Bu bir güncelleme mi? – eleijonmarck

28

Andy Hayden cevabı (index.levels[blah]) bazı senaryolar için harika ama diğerlerinde garip davranışlara yol açabilir. Anladığım kadarıyla, Pandalar, benzer şekilde indeksli DataFram'ların bellekte yer kaplamasından kaçınmak için mümkünse endeksleri "yeniden kullanmaları" için büyük uzunluklara giderler.

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

yerine bir kişi, diğer iş parçacığı üzerinde belirttiği gibi beklenen

Index([u'John', u'Josh'], dtype='object') 
Index([u'Alex', u'John', u'Josh'], dtype='object') 

birden çıkışı, bir deyim çok doğal görünüyor ve: I've found the following annoying behavior Sonuç olarak düzgün çalışır:

small.index.get_level_values('Person').unique() 
large.index.get_level_values('Person').unique() 

Umarım bu, başka birinin, karşılaştığım beklenmedik davranışlardan kaçmasına yardım eder.

+0

FWIW, eğer R'yi taklit etmeye çalışırsanız beklenen davranış budur. R, faktör değişkenlerinin (pandalarda indekslere çok benzeyen) seviyelerini altkümeden sonra değiştirmez. Olası seviyeleri azaltmak için açık bir şekilde yeniden dizilenmesi gerekir. –

İlgili konular