So aktualisieren Sie eine Teilmenge eines MultiIndexed Pandas DataFrame

8

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:

%Vor%

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

    
LondonRob 09.07.2013, 16:05
quelle

2 Antworten

10

Hinweis: In Kürze wird 0.13 ein drop_level Argument zu xs hinzugefügt ( Danke an diese Frage! ):

%Vor%

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) :

%Vor%

Eine andere -Option ist die Förderung der Tag-Ebene für eine Spalte und dann die Anwendung "Anwenden".

    
Andy Hayden 09.07.2013, 16:21
quelle
5

Detaillierte MultiIndexing Erklärung

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:

%Vor%

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.

Auswahl aus Stufe 0 - die äußerste Stufe

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:

%Vor%

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%

Auswahl aus den anderen Ebenen treffen

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 :

%Vor%

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%

Auswählen mehrerer Werte von einer bestimmten Ebene

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%

Auswählen aller Werte von einer bestimmten Ebene.

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%     
Ted Petrou 19.11.2017 20:15
quelle

Tags und Links