¿Cómo cambias Pandas DataFrame con un multiindex?

Con el siguiente DataFrame, ¿cómo puedo cambiar la columna “beyer” en función del índice sin que Pandas asigne el valor cambiado a un valor de índice diferente?

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) produce …

  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 

El problema es que a Paynter se le dio un abogado que le asignaron a Last Gunfighter (su primer registro). En su lugar quiero que sea así …

  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 

Use groupby/shift para aplicar el cambio a cada grupo individualmente: (Gracias a Jeff por señalar esta simplificación).

 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 

Si tiene un índice múltiple, puede agrupar por más de un nivel pasando una secuencia de ints o nombres groupby's level parámetro de level groupby's .