2017-05-27 62 views
2

我有以下数据框:计算由特定的列分组的项目之间的平均时间差

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 

要做到这一点,我需要循环低谷每个用户,并逐一计算平均时差吗?或者,有没有更快的方法来达到同样的结果?

回答

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] D型细胞的系列,其具有.dt.seconds存取器。

使用.dt.seconds.mean()我们可以计算出平均每个组

UPDATE:

取均值比仅是小于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 
+0

的差异谢谢。请问lambda中'x'的类型是什么?这是一系列日期吗?如果是这样,'.diff()'的结果是什么?我很感激,如果你可以提供更多的细节,以便下次我可以自己做:) – renakre

+0

@renakre,当然!你可以这样检查:'df.groupby('userid')['time']。apply(lambda x:print(x.dtypes))'或'df.groupby('userid')['time'] .apply(lambda x:print(type(x)))' – MaxU

+1

@renakre,我已经添加了解释 – MaxU