2016-10-05 10 views
8

lexsorted gerektirir.MultiIndex Dilimleme endeksi tamamen ben <code>foo</code><code>year == someYear</code> X büyük gözlemlerini seçmek ister misiniz indeksi (<code>year</code>, <code>foo</code>) ile bir veri çerçevesi var

Benim yaklaşımım

df.sort_index(level=[0, 1], ascending=[1, 0], inplace=True) 
df.loc[pd.IndexSlice[2002, :10], :] 

oldu ama ben (örn ascending = [0, 0]) sıralama farklı türevlerini denedik

KeyError: 'MultiIndex Slicing requires the index to be fully lexsorted tuple len (2), lexsort depth (0)' 

olsun, ama hepsi hata çeşit sonuçlandı.

Yalnızca xth satırını isteseydim, sıralamadan sonra df.groupby(level=[0]).nth(x) yapabilirdim, ancak bir dizi satır istediğim için, bu oldukça verimli değil.

Bu satırları seçmenin en iyi yolu nedir? Bazı veriler ile oynamak:

    rank_int rank 
year foo       
2015 1.381845    2 320 
    1.234795    2 259 
    1.148488   199  2 
    0.866704    2 363 
    0.738022    2 319 
+0

Sadece df.sort_index (inplace = True) 'kullanarak sıralama yaparsanız ne olur? – ASGM

+0

@ASGM Çalışıyor, ama o zamandan beri yükselmediğim için yanlış gruba 'foo' vereceğim. – FooBar

cevap

0

ikinci seviyenin xth gözlemlerini almak için, bir iloc ile loc birleştirebilirsiniz:

df.sort_index(level=[0, 1], ascending=[1, 0], inplace=True) 
df.loc[2015].iloc[:10] 

beklendiği gibi çalışır. Bu garip dizin kilitleme w.r.t. Ancak lexsorting. Benim için

0

o sort_index(axis=1) kullanarak çalıştı: Bunu yaptığınızda

df = df.sort_index(axis=1) 

, sen slice veya pandas.IndexSlice kullanabilirsiniz örneğin:

df.loc[:, idx[:, 'A']] 
6

Öncelikle böyle sıralama yapmalıyım:

KeyError düzeltmesi gerekir. Ama df.loc[pd.IndexSlice[2002, :10], :] size beklediğiniz sonucu vermeyecektir. Loc fonksiyonu iloc değildir ve foo indekslerinde 0,1.,9 bulmaya çalışacaktır. Multiindex'in ikincil seviyeleri iloc'u desteklemiyor, groupby'yi kullanmanızı öneriyorum. Zaten bu multiindex varsa yapmanız gereken:

df.reset_index() 
df = df.sort_values(by=['year','foo'],ascending=[True,False]) 
df.groupby('year').head(10) 

ihtiyacınız n en az foo ile girdileri tail(n) kullanabilirsiniz. İlk, üçüncü ve beşinci girişlere ihtiyacınız varsa, soruda belirtildiği gibi nth([0,2,4])'u kullanabilirsiniz. Bence bunu yapmanın en etkili yolu.

İlgili konular