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?