计算按特定列分组的项目之间的平均时差

时间:2017-05-27 09:32:07

标签: python pandas dataframe group-by

我有以下数据框:

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

为实现这一目标,我是否需要循环使用每个用户并逐个计算平均时差?或者,是否有更快的方法来实现相同的结果?

1 个答案:

答案 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