Fragen sind am Ende, in fett . Aber zuerst, lassen Sie uns einige Daten einrichten:
%Vor%das gibt:
Ich möchte eine Teilmenge dieses DataFrames für die nachfolgende Analyse herauspicken. Angenommen, ich möchte die Zeilen ausschneiden, in denen die jersey
-Nummer 71 ist. Ich mag die Idee, xs
zu verwenden, nicht wirklich. Wenn Sie einen Querschnitt über xs
erstellen, verlieren Sie die ausgewählte Spalte. Wenn ich renne:
Dann bekomme ich die richtigen Zeilen zurück, aber ich verliere die jersey
Spalte.
Auch scheint xs
keine gute Lösung für den Fall zu sein, dass ich ein paar verschiedene Werte aus der Spalte jersey
haben möchte. Ich denke, eine viel bessere Lösung ist die gefundene hier :
Sie könnten sogar nach einer Kombination aus Trikots und Teams filtern:
%Vor%
Nett!
Also die Frage: Wie kann ich etwas ähnliches für die Auswahl einer Teilmenge von Spalten tun? Sagen wir zum Beispiel, dass ich nur die Spalten haben möchte, die Daten von Ralph darstellen. Wie kann ich das tun, ohne xs
zu benutzen? Oder was, wenn ich nur die Spalten mit observer in ['John', 'Ralph']
wollte? Auch hier würde ich eine Lösung bevorzugen, bei der alle Ebenen der Zeilen- und Spaltenindizes im Ergebnis bleiben ... genau wie bei den obigen booleschen Indexierungsbeispielen.
Ich kann tun, was ich will, und sogar Auswahlen aus den Zeilen- und Spaltenindizes kombinieren. Aber die einzige Lösung, die ich gefunden habe, beinhaltet echte Gymnastik:
%Vor%
Und damit die zweite Frage: Gibt es einen kompakteren Weg, um das zu tun, was ich gerade oben getan habe?
Ab Pandas 0.18 (möglicherweise früher) können Sie einfach Multiindex-Datenrahmen mit schneiden pd.IndexSlice .
Für Ihre spezifische Frage können Sie Folgendes verwenden, um nach Team, Trikot und Spiel zu wählen:
%Vor%IndexSlice benötigt gerade genug Ebeneninformationen, um eindeutig zu sein, so dass Sie den abschließenden Doppelpunkt löschen können:
%Vor%Ebenso können Sie IndexSlice auf Spalten:
%Vor%Was gibt Ihnen den endgültigen DataFrame in Ihrer Frage?
Wenn ich die Frage richtig verstanden habe, ist es ziemlich einfach:
Um die Spalte für Ralph zu erhalten:
%Vor%um es für zwei von ihnen zu bekommen, geben Sie eine Liste ein:
%Vor%Der ix-Operator ist der Leistungsindizierungsoperator. Denken Sie daran, dass das erste Argument Zeilen und dann Spalten sind (im Gegensatz zu Daten [..] [..], die genau umgekehrt sind). Der Doppelpunkt fungiert als Platzhalter, sodass alle Zeilen in Achse = 0 zurückgegeben werden.
Im Allgemeinen sollten Sie ein Tupel übergeben, um in einem MultiIndex nachzuschauen. z.B.
%Vor%Wenn Sie jedoch nur ein einzelnes Element übergeben, wird dies so behandelt, als würden Sie das erste Element des Tupels und dann einen Platzhalter übergeben.
Schwierig wird es, wenn Sie auf Spalten zugreifen wollen, die keine Indizes der Ebene 0 sind. ZB erhalten Sie alle Spalten für "Geschwindigkeit". Dann müssten Sie etwas kreativer werden. Verwenden Sie die Methode get_level_values
von index / column in Kombination mit boolescher Indizierung:
Zum Beispiel erhält dies Jersey 71 in den Zeilen und strength
in den Spalten:
Beachten Sie, dass select
nach meinem Verständnis langsam ist. Aber ein anderer Ansatz wäre hier:
data.select(lambda col: col[0] in ['John', 'Ralph'], axis=1)
Sie können dies auch mit einer Auswahl gegen die Zeilen verketten:
%Vor%Der große Nachteil ist, dass Sie die Index-Level-Nummer kennen müssen.
Tags und Links python pandas multi-index