Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算按特定列分组的项目之间的平均时间差_Python_Pandas_Dataframe_Group By - Fatal编程技术网

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

Python 计算按特定列分组的项目之间的平均时间差,python,pandas,dataframe,group-by,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

我有以下数据帧:

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

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

考虑以下方法:

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的差值的平均值 会议记录

[122]中的
:阈值=60
...:
…:(df.sort_值('time').groupby('userid')['time']
…:.apply(λx:(x.diff().dt.seconds/60)
…:.to_帧('diff'))
…:.query(“diff<@threshold”)['diff'].mean())
...:
出[122]:
用户ID
1     3.500000
2    19.666667
3     2.000000
4楠
名称:时间,数据类型: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,是的,这是正确的。很高兴我能帮忙:)
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