Diferencia horaria dentro del grupo por objetos en Python Pandas

Tengo un dataframe que se ve así:

from to datetime other ------------------------------------------------- 11 1 2016-11-06 22:00:00 - 11 1 2016-11-06 20:00:00 - 11 1 2016-11-06 15:45:00 - 11 12 2016-11-06 15:00:00 - 11 1 2016-11-06 12:00:00 - 11 18 2016-11-05 10:00:00 - 11 12 2016-11-05 10:00:00 - 12 1 2016-10-05 10:00:59 - 12 3 2016-09-06 10:00:34 - 

Quiero agrupar por “de” y luego “a” columnas y luego ordenar la “fecha y hora” en orden descendente y, finalmente, quiero calcular la diferencia de tiempo dentro de estas agrupadas por objetos entre la hora actual y la próxima. Por ejemplo, en este caso, me gustaría tener un dataframe como el siguiente:

 from to timediff in minutes others 11 1 120 11 1 255 11 1 225 11 1 0 (preferrably subtract this date from the epoch) 11 12 300 11 12 0 11 18 0 12 1 25 12 3 0 

¡¡No puedo entenderlo todo !! ¿Hay una salida para esto? Cualquier ayuda será muy apreciada !! ¡Muchas gracias de antemano!

 df.assign( timediff=df.sort_values( 'datetime', ascending=False ).groupby(['from', 'to']).datetime.diff(-1).dt.seconds.div(60).fillna(0)) 

introduzca la descripción de la imagen aquí

Creo que necesitas:

groupby con groupby sort_values with diff , convierte Timedelta a minutos por seconds y división de piso 60

fillna y sort_index , elimina el nivel 2 en el índice

 df = df.groupby(['from','to']).datetime .apply(lambda x: x.sort_values().diff().dt.seconds // 60) .fillna(0) .sort_index() .reset_index(level=2, drop=True) .reset_index(name='timediff in minutes') print (df) from to timediff in minutes 0 11 1 120.0 1 11 1 255.0 2 11 1 225.0 3 11 1 0.0 4 11 12 300.0 5 11 12 0.0 6 11 18 0.0 7 12 3 0.0 8 12 3 0.0 

 df = df.join(df.groupby(['from','to']) .datetime .apply(lambda x: x.sort_values().diff().dt.seconds // 60) .fillna(0) .reset_index(level=[0,1], drop=True) .rename('timediff in minutes')) print (df) from to datetime other timediff in minutes 0 11 1 2016-11-06 22:00:00 - 120.0 1 11 1 2016-11-06 20:00:00 - 255.0 2 11 1 2016-11-06 15:45:00 - 225.0 3 11 12 2016-11-06 15:00:00 - 300.0 4 11 1 2016-11-06 12:00:00 - 0.0 5 11 18 2016-11-05 10:00:00 - 0.0 6 11 12 2016-11-05 10:00:00 - 0.0 7 12 3 2016-10-05 10:00:59 - 0.0 8 12 3 2016-09-06 10:00:34 - 0.0 

Casi como el anterior, pero sin apply :

 result = df.sort_values(['from','to','datetime'])\ .groupby(['from','to'])['datetime']\ .diff().dt.seconds.fillna(0)