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.
Durch die Antworten rund um Stackoverflow für die Indizierung Multiindex Pandas, diese Lösung scheint sowohl die sauberste und ganz unterschätzt. –