我有一个数据框架,看起来像下面。
data = {'user': [3249, 2160, 2160, 3249, 5120, 3900, 3900, 3900, 5200, 5200], 'action': ['step 1', 'step 1', 'step 2', 'step 2', 'step 1', 'step 1', 'step 1', 'step 2', 'step 1', 'step 2'], 'time': ['2021-10-25 19:45:43', '2021-10-25 19:48:46', '2021-10-25 19:50:21', '2021-10-25 19:57:34', '2021-10-25 20:30:56', '2021-10-25 20:35:40', '2021-10-25 20:50:59', '2021-10-25 21:15:08', '2021-10-25 18:23:41', '2021-10-26 18:49:38']}
df = pd.DataFrame(data)
df['time'] = pd.to_datetime(df['time'])
df.sort_values('time', inplace=True)
df
user action time
8 5200 step 1 2021-10-25 18:23:41
0 3249 step 1 2021-10-25 19:45:43
1 2160 step 1 2021-10-25 19:48:46
2 2160 step 2 2021-10-25 19:50:21
3 3249 step 2 2021-10-25 19:57:34
4 5120 step 1 2021-10-25 20:30:56
5 3900 step 1 2021-10-25 20:35:40
6 3900 step 1 2021-10-25 20:50:59
7 3900 step 2 2021-10-25 21:15:08
9 5200 step 2 2021-10-26 18:49:38
我希望能够计算用户从步骤1到步骤2所花费的平均时间,然后按天分组,最终得到如下所示:
日期 | 平均时长 | 2021-10-25 | 752秒 |
---|---|
2021-10-26 | 87957秒 |
我认为在使用pandas的简单方法之前,您可能需要一个逻辑密集的步骤来清理数据。就像Hoang指出的那样,用户3900有两个步骤1,后面跟着一个步骤2。在进行汇总之前,必须对其进行解释。如果您假设是1对1的关系,并且最后的步骤1是有效的(假设用户终止了前一个步骤1或者它崩溃了,等等),那么您应该删除这些重复项。如果用户成功地多次运行步骤1到步骤2,但是最后一次步骤2没有启动,那么问题就更加复杂了。因此,您不能只选择每个用户步骤的最后一次时间。
我的偏好通常是假设存在最丑陋的数据,并进行1对1匹配,从而在使用pandas聚合和pivot函数之前放弃中断的步骤1。