【问题标题】:Calculating average time difference among items grouped by a specific column计算按特定列分组的项目之间的平均时间差
【发布时间】:2017-05-27 09:32:07
【问题描述】:

我有以下数据框:

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

要实现这一点,我是否需要循环遍历每个用户并一一计算平均时间差?或者,有没有更快的方法来达到同样的效果?

【问题讨论】:

    标签: python pandas dataframe group-by


    【解决方案1】:

    考虑以下方法:

    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 的Series,它有一个.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
    

    【讨论】:

    • 谢谢。请问lambda里面x的类型是什么?是一系列日期吗?如果是这样,.diff() 的结果是什么?如果您能提供更多详细信息,我将不胜感激,以便下次我可以自己做:)
    • @renakre,当然!您可以这样查看:df.groupby('userid')['time'].apply(lambda x: print(x.dtypes))df.groupby('userid')['time'].apply(lambda x: print(type(x)))
    • @renakre,我已经添加了解释
    • 太棒了!我现在明白了。我想知道仅对小于 60 的差异取平均值是否容易?
    • @renakre,是的,这是正确的。很高兴我能帮忙:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 2019-07-12
    • 1970-01-01
    相关资源
    最近更新 更多