我有以下数据框:
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
我想要获得的是每个用户的新列,用于存储连续活动之间的平均时差:
userid | avg_time_diff
1 3.5 #(5 + 2) / 2
2 2 #(4 + 1 + 1) / 3
3 2
4 0
为实现这一目标,我是否需要循环使用每个用户并逐个计算平均时差?或者,是否有更快的方法来实现相同的结果?
答案 0 :(得分:2)
考虑以下方法:
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
一些解释:
首先我们按照time
列对DF进行排序,否则我们可能会产生负面差异。
然后我们按userid
进行分组,对于每个组,我们计算所有连续行的时间差(已排序) - 这将产生一系列timedelta64[ns]
dtype,其中.dt.seconds
存取器。
使用.dt.seconds.mean()
,我们可以计算每组的平均值
<强>更新强>
仅取小于60的差异 分钟
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