Python查找由第三列分组的列中两个事件之间的平均差

2024-04-19 04:42:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个data.frame,它包含web应用程序的打开和关闭时间,并按id分组。如何找到每个id的打开和关闭事件之间的平均差异?我的第一反应是按id分组,但我不知道以后该怎么办

以下是我正在使用的data.frame的示例:

id     event date_time_obj
 1     open   14:20:24
 1     close  14:24:01
 2     open   14:21:36
 2     close  14:27:56
 1     open   14:23:20
 1     close  14:25:35

我被df.groupby()函数之后该做什么所困扰。我希望我的最终df如下所示:

id  avg_difference_secs
1    176 ((217+135)/2)
2    380

Tags: eventwebid应用程序示例dfclosedata
1条回答
网友
1楼 · 发布于 2024-04-19 04:42:31

您可以这样做,使用一个示例df(假设您的时间已经是datetime格式或某种可行的格式):

df = pd.DataFrame({'id':[1,1,2,2,1,1,2,2],
                   'event':['open','close','open','close','open','close','open','close'],
                   'time':[1,9,2,14,2,6,12,57]})
df

       id  event  time
    0   1   open     1
    1   1  close     9
    2   2   open     2
    3   2  close    14
    4   1   open     2
    5   1  close     6
    6   2   open    12
    7   2  close    57

df['duration'] = df['time'].diff()
avgs = df[df['event']=='close'].groupby('id').agg(np.mean)['duration']

avgs

id
1     6.0
2    28.5

编辑-这里有一个使用精确df的更具体的示例。如果这不起作用,那么很可能是您如何定义df从现有df剪切/复制一个切片

df

   id  event date_time_obj
0   1   open      14:20:24
1   1  close      14:24:01
2   2   open      14:21:36
3   2  close      14:27:56
4   1   open      14:23:20
5   1  close      14:25:35

df['date_time_obj'][0]

datetime.time(14, 20, 24) #using this format based on the info in your OP

df['seconds'] = df['date_time_obj'].apply(lambda x: x.second + x.minute*60 + x.hour*3600)

如果您的时间格式不同,则上述步骤可能更简单,也可能不需要。对于datetime.time,没有转换为秒的方法,并且它们不支持直接加法/减法

df

   id  event date_time_obj  seconds
0   1   open      14:20:24    51624
1   1  close      14:24:01    51841
2   2   open      14:21:36    51696
3   2  close      14:27:56    52076
4   1   open      14:23:20    51800
5   1  close      14:25:35    51935

df['duration'] = df['seconds'].diff()
avgs = df[df['event']=='close'].groupby('id').agg(np.mean)['duration']

avgs

id
1    176.0
2    380.0

期望输出

相关问题 更多 >