2015-10-18 12 views
7

Çok satırlı bir düzlemin [0] seviyesini 1 düzeyine göre dilimlemek için birçok gönderi vardır. Ancak, benim sorunum için bir çözüm bulamıyorum; Yani, seviye [0] dizin değerleriPython Pandas multi multi-endeksini ikinci seviye dizinine (ya da başka bir düzeye) göre

veri çerçevesi için bir düzey 1 dizinine ihtiyacım var: Önce A'dan Z'ye, Rank 1'den 400'e; Her seviye için ilk 2 ve son 2'ye ihtiyacım var [0] (İlk), ancak aynı adımda değil.

  Title Score 
First Rank 
A  1 foo 100 
     2 bar 90 
     3 lime 80 
     4 lame 70 
B  1 foo 400 
     2 lime 300 
     3 lame 200 
     4 dime 100 

aşağıda koduyla her seviye 1 endeksi için son 2 satır almaya çalışıyorum, ancak yalnızca birinci seviyede [0] değeri için düzgün dilimler.

[IN] df.ix[x.index.levels[1][-2]:] 
[OUT] 
       Title Score 
    First Rank 
    A  3 lime 80 
      4 lame 70 
    B  1 foo 400 
      2 lime 300 
      3 lame 200 
      4 dime 100 

ilk 2 satır Ben indeksleri değiştirerek olsun, ama son 2 satırlar için iş yapamazsınız. Bunu geri takas olabilir Tabii

df.index = df.index.swaplevel("Rank", "First") 
df= df.sortlevel() #to sort by Rank 
df.ix[1:2] #Produces the first 2 ranks with 2 level[1] (First) each. 
      Title Score 
Rank First 
1  A foo 100 
     B foo 400 
2  A bar 90 
     B lime 300 

bu almak için: endeksi 1 (Sıralama için

  • Son 2 satır: Herhangi bir yardım aynı prosedüre almak için takdir edilmektedir

    df2 = df.ix[1:2] 
    df2.index = ttt.index.swaplevel("First","rank") #change the order of the indices back. 
    df2.sortlevel() 
           Title Score 
        First Rank 
        A  1 foo 100 
          2 bar 90 
        B  1 foo 400 
          2 lime 300 
    

    )

  • Ve ilk 2 satırı almanın daha iyi bir yolu
@ako tarafından geribildirim aşağıdaki

Düzenleme:

pd.IndexSlice kullanılması gerçekten kolay herhangi düzey endeksi dilim kolaylaştırır. Burada daha genel bir çözüm ve ilk ve son iki satırı elde etmek için adım adım yaklaşımımın altında. Burada daha fazla bilgi: http://pandas.pydata.org/pandas-docs/stable/advanced.html#using-slicers

"""  
Slicing a dataframe at the level[2] index of the 
major axis (row) for specific and at the level[1] index for columns. 

""" 
    df.loc[idx[:,:,['some label','another label']],idx[:,'yet another label']] 

""" 
Thanks to @ako below is my solution, including how I 
get the top and last 2 rows. 
""" 
    idx = pd.IndexSlice 
    # Top 2 
    df.loc[idx[:,[1,2],:] #[1,2] is NOT a row index, it is the rank label. 
    # Last 2 
    max = len(df.index.levels[df.index.names.index("rank")]) # unique rank labels 
    last2=[x for x in range(max-2,max)] 
    df.loc[idx[:,last2],:] #for last 2 - assuming all level[0] have the same lengths. 

cevap

10

keyfi boyutlarda keyfi değerleri dilim indexleyici kullanın - sadece istenilen seviyeleri/değerler söz konusu boyutun ne olursa olsun içeren bir liste geçirir. verileri çoğaltmak için

idx = pd.IndexSlice 
df.loc[idx[:,[3,4]],:] 

      Title Score 
First Rank    
A  3  lime  80 
     4  lame  70 
B  3  lame 200 
     4  dime 100 

: indeksleme MultiIndex Pandalar için StackOverflow'daki etrafında cevapları By

from StringIO import StringIO 

s=""" 
First Rank Title Score 
A  1 foo 100 
A  2 bar 90 
A  3 lime 80 
A  4 lame 70 
B  1 foo 400 
B  2 lime 300 
B  3 lame 200 
B  4 dime 100 
""" 
df = pd.read_csv(StringIO(s), 
       sep='\s+', 
       index_col=["First", "Rank"]) 
+2

, bu çözüm hem en temiz ve oldukça underappreciated görünüyor. –

İlgili konular