2015-10-18 7 views
7

Es gibt viele Beiträge zum Schneiden der Ebene [0] eines Multiindex um einen Bereich von 1 Ebene. Ich kann jedoch keine Lösung für mein Problem finden; das heißt, ich brauche einen Bereich der Ebene 1 Index für Level [0] IndexwertePython Pandas Scheibe Multiindex von Second-Level-Index (oder einer anderen Ebene)

Datarame: Erstens ist A bis Z, Rang ist 1 bis 400; Ich brauche die ersten 2 und die letzten 2 für jedes Level [0] (First), aber nicht im selben Schritt.

  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 

Ich versuche, die letzten 2 Zeilen für jede Ebene 1 Index mit dem folgenden Code zu bekommen, aber es schneidet eigentlich nur für die erste Ebene [0] Wert.

Die ersten 2 Zeilen bekomme ich durch den Austausch der Indizes, aber ich kann es nicht für die letzten 2 Zeilen arbeiten lassen.

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 

Natürlich habe ich diese wieder dieses zu erhalten, tauschen:

  • letzten 2 Zeilen für Index 1 (Rang:

    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 
    

    Jede Hilfe mit dem gleichen Verfahren zu erhalten geschätzt)

  • Und ein besserer Weg, um die ersten 2 Zeilen zu bekommen

Bearbeiten von @ako folgendes Feedback:

pd.IndexSlice wirklich macht es leicht, jede Ebene Index zu schneiden. Hier eine allgemeinere Lösung und unter meinem schrittweisen Ansatz, um die ersten und letzten zwei Zeilen zu erhalten. Weitere Informationen hier: 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. 

Antwort

10

einen Indexer Verwenden Sie beliebige Werte in beliebigen Dimensionen zu schneiden - nur eine Liste übergeben mit dem, was die gewünschten Mengen/Werte sind für diese Dimension.

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 

Für die Wiedergabe von Daten:

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

Durch die Antworten rund um Stackoverflow für die Indizierung Multiindex Pandas, diese Lösung scheint sowohl die sauberste und ganz unterschätzt. –

Verwandte Themen