Ich verwende einen MultiIndexed Pandas DataFrame und möchte eine Teilmenge des DataFrames mit einer bestimmten Zahl multiplizieren.
Es ist dasselbe wie dies , aber mit ein MultiIndex.
%Vor% So weit, so gut. Aber sagen wir mal, dass alle Samstagszahlen nur halb so groß sind wie sie sein sollten! Ich möchte alle sat
Verkäufe mit 2 multiplizieren.
Mein erster Versuch war:
%Vor% aber das funktioniert nicht, weil die Variable sat
den day
Level des Indexes verloren hat:
damit pandas nicht weiß, wie man die neuen Verkaufszahlen wieder auf den alten Datenrahmen bringt.
Ich hatte einen kurzen Stich:
%Vor%Ich habe keine Ahnung, was dieser Fehler bedeutet, aber ich fühle mich, als würde ich aus einem Maulwurfshügel einen Berg machen. Kennt jemand den richtigen Weg dazu?
Vielen Dank im Voraus, Rob
Hinweis: In Kürze wird 0.13 ein drop_level
Argument zu xs hinzugefügt ( Danke an diese Frage! ):
Eine weitere Option ist die Verwendung von select (die einen Sub-DataFrame (Kopie) der gleichen Daten extrahiert, d. h. sie hat denselben Index und kann daher korrekt aktualisiert werden):
%Vor%Eine andere Option besteht darin, eine Anwendung zu verwenden:
%Vor% Eine andere -Option besteht darin, get_level_values
zu verwenden (dies ist wahrscheinlich der effizienteste Weg) :
Eine andere -Option ist die Förderung der Tag-Ebene für eine Spalte und dann die Anwendung "Anwenden".
Sie können den .loc
Indexer verwenden, um Teilmengen von Daten aus einem DataFrame mit einem MultiIndex auszuwählen. Angenommen, wir haben die Daten der ursprünglichen Frage:
Dieser Datenrahmen hat drei Ebenen in seinem Index und jede Ebene hat einen Namen ( year
, flavour
und day
). Die Ebenen haben implizit auch ganzzahlige Positionen, beginnend mit 0 von außen. So kann der year
- Level als 0
, flavour
mit 1
und day
als 2
referenziert werden.
Level 0
ist die einfachste Ebene, um eine Auswahl mit zu treffen. Wenn wir beispielsweise nur das Jahr 2008 auswählen wollten, könnten wir Folgendes tun:
Dadurch wird die äußere Indexstufe verringert. Wenn Sie die äußere Ebene beibehalten möchten, können Sie Ihre Auswahl als Liste (oder als Teil) übergeben:
%Vor% Die Auswahl von einem anderen Level als Level 0 ist komplizierter. Beginnen wir mit der Auswahl einer bestimmten Kombination wie dem Jahr 2008
, banana
und sat
. Dazu übergeben Sie die Kombination als Tupel an .loc
:
Ich verwende immer Klammern wie oben, aber Python interpretiert automatisch alle kommagetrennten Werte als Tupel, so dass das folgende Ergebnis das gleiche Ergebnis liefert:
%Vor%Alle Level wurden fallen gelassen und eine Serie kam zurück. Wir können die Ebenen beibehalten, indem wir das Tupel innerhalb einer Liste übergeben:
%Vor%Im vorherigen Beispiel wurde aus jeder Ebene eine einzige Auswahl getroffen. Es ist möglich, eine Liste zu verwenden, die alle gewünschten Werte enthält. Zum Beispiel, wenn wir alle Zeilen mit Jahr 2008 und 2009, mit Bananengeschmack und am Samstag und Sonntag auswählen wollten, könnten wir folgendes tun:
%Vor%Auch hier müssen Sie nicht die gesamte Auswahl in Paraenthesen umbrechen, um ein Tupel zu bezeichnen, und Sie können einfach tun:
%Vor%Sie können stattdessen alle Werte von einer bestimmten Ebene auswählen. Zum Beispiel versuchen wir, alle Jahre, alle Aromen und nur Samstag auszuwählen. Sie könnten denken, dass das Folgende funktionieren würde:
%Vor%Aber das ist mit einem 'zu vielen Indexer IndexError erfüllt. Es gibt drei verschiedene Möglichkeiten, alle Werte einer bestimmten Ebene auszuwählen.
df.loc[(slice(None), slice(None), 'sat'), :]
df.loc(axis=0)[:, :, 'sat']
df.loc[pd.IndexSlice[:, :, 'sat'], :]
Alle drei ergeben folgendes:
%Vor%