una nombre lista datos data crear columnas columna cambiar añadir agregar python pandas dataframe group-by

python - nombre - crear columna pandas



Cálculo de la diferencia de tiempo promedio entre los artículos agrupados por una columna específica (1)

Considere el siguiente enfoque:

In [84]: df.sort_values(''time'').groupby(''userid'')[''time''] / .apply(lambda x: x.diff().dt.seconds.mean()/60) Out[84]: userid 1 3.500000 2 19.666667 3 2.000000 4 NaN Name: time, dtype: float64

Algunas explicaciones

Primero ordenamos la columna DF por time , de lo contrario podríamos tener una diferencia negativa.

Luego, userid por userid de userid y para cada grupo calculamos una diferencia de tiempo para todas las filas consecutivas (ordenadas); esto generará una serie de timedelta64[ns] dtype, que tiene un .dt.seconds acceso .dt.seconds .

Usando .dt.seconds.mean() podemos calcular el promedio para cada grupo

ACTUALIZAR:

tomar la media sobre las diferencias que son menores de 60 minutos

In [122]: threshold = 60 ...: ...: (df.sort_values(''time'').groupby(''userid'')[''time''] ...: .apply(lambda x: (x.diff().dt.seconds/60) ...: .to_frame(''diff'') ...: .query("diff < @threshold")[''diff''].mean())) ...: Out[122]: userid 1 3.500000 2 19.666667 3 2.000000 4 NaN Name: time, dtype: float64

Tengo el siguiente marco de datos:

userid | time 1 22.01.2001 13:00 1 22.01.2001 13:05 1 22.01.2001 13:07 2 22.01.2001 14:00 2 22.01.2001 14:04 2 22.01.2001 13:05 2 22.01.2001 13:06 3 22.01.2001 13:20 3 22.01.2001 13:22 4 22.01.2001 13:37

Lo que quiero obtener es una nueva columna por usuario que almacene la diferencia de tiempo promedio entre las actividades consecutivas:

userid | avg_time_diff 1 3.5 #(5 + 2) / 2 2 2 #(4 + 1 + 1) / 3 3 2 4 0

Para lograr esto, ¿necesito pasar por cada usuario y calcular la diferencia de tiempo promedio uno por uno? ¿O hay una forma más rápida de lograr el mismo resultado?