Boolesche Indizierung für Zeilen- und Spalten-MultiIndex in Pandas

9

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:

%Vor%

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 :

%Vor%

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?

    
8one6 24.12.2013, 04:10
quelle

4 Antworten

1

Hier ist ein Ansatz, der etwas mehr eingebaute Syntax verwendet. Aber es ist immer noch klobig wie die Hölle:

%Vor%

Also Vergleich:

%Vor%

Ergebnisse:

%Vor%

Ich hoffe immer noch, dass es eine sauberere oder kanonischere Methode gibt, dies zu tun.

    
8one6 24.12.2013, 04:58
quelle
2

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?

    
Cory Jog 07.02.2018 18:58
quelle
1

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:

%Vor%     
Luciano 24.12.2013 22:03
quelle
0

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.

    
Paul H 02.01.2014 22:49
quelle

Tags und Links