2014-04-21 15 views
16

Wie kann ich mit dem folgenden DataFrame die "beyer" -Spalte basierend auf dem Index verschieben, ohne dass Pandas den verschobenen Wert einem anderen Indexwert zuweisen?Wie verschiebt man Pandas DataFrame mit einem Multiindex?

    line_date line_race beyer 
horse           
Last Gunfighter 2013-09-28   10  99 
Last Gunfighter 2013-08-18   10 102 
Last Gunfighter 2013-07-06   8 103 
..... 
Paynter   2013-09-28   10 103 
Paynter   2013-08-31   10  88 
Paynter   2013-07-27   8 100 

df['beyer'].shift(1) produziert ...

    line_date line_race beyer beyer_shifted 
horse              
Last Gunfighter 2013-09-28   10  99   NaN 
Last Gunfighter 2013-08-18   10 102    99 
Last Gunfighter 2013-07-06   8 103   102 
..... 
Paynter   2013-09-28   10 103    71 
Paynter   2013-08-31   10  88   103 
Paynter   2013-07-27   8 100    88 

Das Problem ist, dass Paynter eine beyer, die Last Gunfighter (seine erste Platte) zugewiesen wurde gegeben wurde. Stattdessen möchte ich es so gehen ...

    line_date line_race beyer beyer_shifted 
horse              
Last Gunfighter 2013-09-28   10  99   NaN 
Last Gunfighter 2013-08-18   10 102    99 
Last Gunfighter 2013-07-06   8 103   102 
..... 
Paynter   2013-09-28   10 103   NaN 
Paynter   2013-08-31   10  88   103 
Paynter   2013-07-27   8 100    88 

Antwort

25

Verwenden groupby/shift die Verschiebung auf jede Gruppe einzeln anzuwenden: (. Dank Jeff für diese Vereinfachung unter Hinweis darauf)

In [60]: df['beyer_shifted'] = df.groupby(level=0)['beyer'].shift(1); df 
Out[61]: 
        line_date line_race beyer beyer_shifted 
Last Gunfighter 2013-09-28   10  99   NaN 
Last Gunfighter 2013-08-18   10 102    99 
Last Gunfighter 2013-07-06   8 103   102 
Paynter   2013-09-28   10 103   NaN 
Paynter   2013-08-31   10  88   103 
Paynter   2013-07-27   8 100    88 

Wenn Sie ein Multiindex, können Sie um mehr als eine Ebene gruppieren, indem Sie eine Sequenz von ints oder Ebenennamen an groupby'slevel Parameter übergeben.

+0

Das hat perfekt funktioniert. Vielen Dank! – TravisVOX

+0

Ich denke, wir sollten das zum Kochbuch hinzufügen. Kannst du eine PR machen, wenn du eine Chance hast? – Jeff

+0

Warum würde es dieses Problem aufwerfen? ValueError: Neuindizierung von einer doppelten Achse nicht möglich – TravisVOX

Verwandte Themen