2013-11-14 11 views
15

Bir csv dosyasından yüklenen ve daha sonra dizini, set_index yöntemiyle birkaç (genellikle iki veya üç) sütununa yükleyen bir veri karegim var. Fikir gibi birçok tuş kombinasyonunu kullanarak dataframe sonra erişim bölümlerine geçerli: dataframe Çok Endeksi yeterli derinliğe sıralanır eğerÇoklu Dizini Tam derinliğe (Pandalar) Sıralama

df.set_index(['fileName','phrase']) 
df.ix['somePath','somePhrase'] 

Appearntly, çoklu tuşlarıyla seçim bu tip mümkündür . Bu durumda, iki anahtar beslemesinden dolayı, .ix işlemi, veri dizisi çoklu dizini, herhangi bir sebepten ötürü, gösterildiği gibi endeksi ayarladığım zaman, herhangi bir nedenle, en az 2. derinlik 2

bana her iki katman da sıralanır, df.index.lexsort_depth komutu 1'i döndürür ve iki anahtarla erişmeye çalışırken aşağıdaki hatayı alırım: MultiIndex lexsort depth 1, key was length 2

Herhangi bir yardım?

cevap

11

Ne sorduğunuzu tam olarak açık değil. Çok endeks docs here

OP belirli bir sonuç

df.ix[('somePath','somePhrase')] 

Belki sadece almak için bir başlığın üzerinden bu seviyeleri erişmek

df.set_index(['fileName','phrase'],inplace=True) 
df.sortlevel(inplace=True) 

Sonraki sıralama yerinde, sonra endeksini ayarlamak gerekiyor vardır Bunun gibi bir oyuncak örneği verin ve belirli bir sonuç almak istiyorum.

In [1]: arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']) 
    ...: .....: , 
    ...: .....:   np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']) 
    ...: .....:   ] 

In [2]: df = DataFrame(randn(8, 4), index=arrays) 

In [3]: df 
Out[3]: 
       0   1   2   3 
bar one 1.654436 0.184326 -2.337694 0.625120 
    two 0.308995 1.219156 -0.906315 1.555925 
baz one -0.180826 -1.951569 1.617950 -1.401658 
    two 0.399151 -1.305852 1.530370 -0.132802 
foo one 1.097562 0.097126 0.387418 0.106769 
    two 0.465681 0.270120 -0.387639 -0.142705 
qux one -0.656487 -0.154881 0.495044 -1.380583 
    two 0.274045 -0.070566 1.274355 1.172247 

In [4]: df.index.lexsort_depth 
Out[4]: 2 

In [5]: df.ix[('foo','one')] 
Out[5]: 
0 1.097562 
1 0.097126 
2 0.387418 
3 0.106769 
Name: (foo, one), dtype: float64 

In [6]: df.ix['foo'] 
Out[6]: 
      0   1   2   3 
one 1.097562 0.097126 0.387418 0.106769 
two 0.465681 0.270120 -0.387639 -0.142705 

In [7]: df.ix[['foo']] 
Out[7]: 
       0   1   2   3 
foo one 1.097562 0.097126 0.387418 0.106769 
    two 0.465681 0.270120 -0.387639 -0.142705 

In [8]: df.sortlevel(level=1) 
Out[8]: 
       0   1   2   3 
bar one 1.654436 0.184326 -2.337694 0.625120 
baz one -0.180826 -1.951569 1.617950 -1.401658 
foo one 1.097562 0.097126 0.387418 0.106769 
qux one -0.656487 -0.154881 0.495044 -1.380583 
bar two 0.308995 1.219156 -0.906315 1.555925 
baz two 0.399151 -1.305852 1.530370 -0.132802 
foo two 0.465681 0.270120 -0.387639 -0.142705 
qux two 0.274045 -0.070566 1.274355 1.172247 

In [10]: df.sortlevel(level=1).index.lexsort_depth 
Out[10]: 0 
+0

Açık sanıyordum. Bağlandığınız belgeyi gördüm, yardımcı olmadı. Bu anahtar ile belirli bir satırı açmaya çalıştığınızda sorun başlar. Dizin tüm düzeylere göre sıralanmazsa, bir hata alırsınız. soru indeksi her seviyede – idoda

+0

sadece '' df.sortlevel() '' – Jeff

+0

nasıl sıralamak olduğunu, doğru çalışmıyor. 'fileName' ile sıraya girdiğimde, dış indeks sıralanır, bir iç ('cümle') karışır. 'ifade' ile sıralandığında, iç seviye sıralanırken, dış düzey ('dosyaAdı') karıştırılır. Her iki durumda da, sıralama derinliği 1'dir, bu da df'ye iki anahtarla erişmemi engeller. Dış indeksi sıralamak için bir yola ihtiyacım var ve ** sonra dış indeksin sırasını değiştirmeden iç indeksi sırala. yani iki katmana ihtiyacım var. – idoda

4

ben biraz zaman geçti farkında ama @idoda yaptığı gibi dataframes kolon ve endeks hem birden fazla dizin olabilir zaman kabul cevap MultiIndex dataframes çalışmıyor ile, aynı problem olmuş görünmektedir.

df.sortlevel(inplace=True,sort_remaining=True) 

Ve hala alıyorsanız: Denersen anda burada gösterilmeyen hile, ayrıca Örneğin 1.

ayarlanabilir sıfıra varsayılan ama bir "eksen" seçeneği olmasıdır lexsort hataları, onların içinde bir varsayılan "axis = 0" kwarg olduğunu bilmek alakalı olabilir. Bu nedenle, diğer yönünü de sıralamayı deneyebilirsiniz. Bunu düşünmek istemiyorum, aşağıdakileri yapabilirsiniz sadece kaba kuvvet onu:

df.sortlevel(axis=0,inplace=True,sort_remaining=True) 
df.sortlevel(axis=1,inplace=True,sort_remaining=True) 

Yani gerektiğini tam olarak sıralamak her düzeyde sütunlar ve satır endeksleri hem. Burada aynı sorun vardı ve önerilen cevap ile tam bir lexsort alamadım ama biraz araştırma "sort_remaining" ile bile sıralama seviyesinin sadece tek bir eksen için geçerli olduğunu gösterdi. Bu snippet'ler, mevcut pythonic yerel yanıtı olarak görünen çözümlerdir. Umarım birileri yardımcı bulur!

0

Pandalar sağlamaktadır: çoğu durumda istediğinizi yapacak

d = d.sort_index() 
print d.index.is_lexsorted() # Sometimes true 

. Ancak, her zaman dizini sıralayın, ancak 'lexsorted' (örneğin, dizinde NAN varsa), generates a PerformanceWarning.

Bunu önlemek için:

d = d.sort_index(level=d.index.names) 
print d.index.is_lexsorted() # true 

... neden orada bir fark belgelendirilmesi görünmüyor bile.

İlgili konular