¿Cómo calcular la diferencia de tiempo por grupo usando pandas?

Problema

Quiero calcular la diff por grupo. Y no sé cómo ordenar la columna de time para que los resultados de cada grupo sean ordenados y positivos.

Los datos originales:

 In [37]: df Out[37]: id time 0 A 2016-11-25 16:32:17 1 A 2016-11-25 16:36:04 2 A 2016-11-25 16:35:29 3 B 2016-11-25 16:35:24 4 B 2016-11-25 16:35:46 

El resultado que quiero

 Out[40]: id time 0 A 00:35 1 A 03:12 2 B 00:22 

Aviso: el tipo de tiempo col es timedelta64 [ns]

Molesto

 In [38]: df['time'].diff(1) Out[38]: 0 NaT 1 00:03:47 2 -1 days +23:59:25 3 -1 days +23:59:55 4 00:00:22 Name: time, dtype: timedelta64[ns] 

No obtengas el resultado deseado.

Esperanza

No solo resuelve el problema, sino que el código puede ejecutarse rápidamente porque hay 50 millones de filas.

Puede usar sort_values con groupby y agregando diff :

 df['diff'] = df.sort_values(['id','time']).groupby('id')['time'].diff() print (df) id time diff 0 A 2016-11-25 16:32:17 NaT 1 A 2016-11-25 16:36:04 00:00:35 2 A 2016-11-25 16:35:29 00:03:12 3 B 2016-11-25 16:35:24 NaT 4 B 2016-11-25 16:35:46 00:00:22 

Si es necesario eliminar filas con NaT en la columna diff use dropna :

 df = df.dropna(subset=['diff']) print (df) id time diff 2 A 2016-11-25 16:35:29 00:03:12 1 A 2016-11-25 16:36:04 00:00:35 4 B 2016-11-25 16:35:46 00:00:22 

También puede sobrescribir la columna:

 df.time = df.sort_values(['id','time']).groupby('id')['time'].diff() print (df) id time 0 A NaT 1 A 00:00:35 2 A 00:03:12 3 B NaT 4 B 00:00:22 

 df.time = df.sort_values(['id','time']).groupby('id')['time'].diff() df = df.dropna(subset=['time']) print (df) id time 1 A 00:00:35 2 A 00:03:12 4 B 00:00:22