2014-04-21 11 views
16

W następującym DataFrame, w jaki sposób mogę przesunąć kolumnę "beyer" na podstawie indeksu bez Pandy przypisywania przesuniętej wartości do innej wartości indeksu?W jaki sposób zmieniasz Pandas DataFrame w multiindeks?

    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) produkuje ...

    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 

Problemem jest to, że Paynter dano Beyer, że w ubiegłym Gunfighter (jego pierwszy rekord) został przypisany. Zamiast tego chcę iść tak ...

    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 

Odpowiedz

25

Korzystając groupby/shift zastosować przejście do każdej z grup oddzielnie: (. Dzięki Jeff za wskazanie tego uproszczenia)

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 

Jeśli masz multiindex można grupować według więcej niż jednego poziomu, przekazując sekwencję ints lub nazw poziomów do parametru groupby'slevel.

+0

To działało idealnie. Dziękuję Ci! – TravisVOX

+0

Myślę, że powinniśmy dodać to do książki kucharskiej. czy możesz zrobić PR, kiedy masz szansę? – Jeff

+0

Dlaczego to zwrócił ... ValueError: nie można ponownie indindować z duplikatu osi – TravisVOX

Powiązane problemy