我有一个数据,包括用户的旅行和旅行方式用于完成旅行。在原始的trips文件中,有些旅行实际上是一次旅行,但是由于用户改变旅行模式或停留几分钟而分成2次旅行。我想对一定时期内的旅行次数进行分析,但显然不喜欢一次两次,因此我需要一种方法来识别这类旅行,并且只计算一次。
例如,考虑这个示例dataframe (从原始文件中提取):
df = pd.DataFrame({
'user': [62,62,62,62,62,62,62,62,62],
'start': ['2008-06-20 04:21:40','2008-06-20 05:40:31','2008-06-21 04:23:39',
'2008-06-21 04:47:53','2008-07-13 05:45:27','2008-07-13 06:47:57',
'2008-07-14 09:08:06','2008-07-14 13:12:46','2008-07-14 13:24:23'],
'end': ['2008-06-20 05:33:46','2008-06-20 05:53:11','2008-06-21 04:35:15',
'2008-06-21 05:43:20','2008-07-13 06:02:54','2008-07-13 07:20:19',
'2008-07-14 09:17:15','2008-07-14 13:20:10','2008-07-14 13:30:43'],
'mode': ['bus','walk','bus','bus','bus','bus','taxi','bus','bus']
})
因此:
df
user start end mode
0 62 2008-06-20 04:21:40 2008-06-20 05:33:46 bus
1 62 2008-06-20 05:40:31 2008-06-20 05:53:11 walk
2 62 2008-06-21 04:23:39 2008-06-21 04:35:15 bus
3 62 2008-06-21 04:47:53 2008-06-21 05:43:20 bus
4 62 2008-07-13 05:45:27 2008-07-13 06:02:54 bus
5 62 2008-07-13 06:47:57 2008-07-13 07:20:19 bus
6 62 2008-07-14 09:08:06 2008-07-14 09:17:15 taxi
7 62 2008-07-14 13:12:46 2008-07-14 13:20:10 bus
8 62 2008-07-14 13:24:23 2008-07-14 13:30:43 bus
从这个特定用户的旅行中我们可以看到:
05.33
结束,第二次从05.40
开始。这是一次旅行,用户只停留了大约7分钟,然后改变了旅行模式,bus -> walk
.04.35
结束,第四次旅行开始于04.47
。我们认为这是一次旅行,因为中间时间不到20分钟.也许用户经历了12分钟的数据日志记录,然后continued.06:02
结束,第六次旅行开始于06:47
。我们认为这是两个分开的旅行,因为时间间隔超过了20-minutes.13.20
,第九次旅行开始于13.24
。这也是一次旅行。--在给定的示例中,此用户涵盖6-distinct trips
,否则可能被错误地计算为9-trips
。我有超过50个不同的用户涵盖了几次旅行,因此这可能导致严重错误的旅行分析。
如果时间间隔小于20分钟,我们将连续2次用户行程视为一次行程。
我不知道如何用熊猫对不同的旅行进行分析。
发布于 2022-06-13 13:27:19
您可以将每个组的结束移动并计算到下一个开始。然后使用它计算组:
# ensure datetime
df[['start', 'end']] = df[['start', 'end']].apply(pd.to_datetime)
# sort by user/start
df2 = df.sort_values(by=['user', 'start', 'end'])
# if end is within 20 min of next start, then keep in same group
group = df2['start'].sub(df2.groupby('user')['end'].shift()).gt('20 min').cumsum()
df['group'] = group
产出:
user start end mode group
0 62 2008-06-20 04:21:40 2008-06-20 05:33:46 bus 0
1 62 2008-06-20 05:40:31 2008-06-20 05:53:11 walk 0
2 62 2008-06-21 04:23:39 2008-06-21 04:35:15 bus 1
3 62 2008-06-21 04:47:53 2008-06-21 05:43:20 bus 1
4 62 2008-07-13 05:45:27 2008-07-13 06:02:54 bus 2
5 62 2008-07-13 06:47:57 2008-07-13 07:20:19 bus 3
6 62 2008-07-14 09:08:06 2008-07-14 09:17:15 taxi 4
7 62 2008-07-14 13:12:46 2008-07-14 13:20:10 bus 5
8 62 2008-07-14 13:24:23 2008-07-14 13:30:43 bus 5
汇总数据:
(df
.groupby(group)
.agg({'user': 'first', 'start': 'first', 'end': 'max',
'mode': lambda x: '+'.join(set(x))})
)
产出:
user start end mode
0 62 2008-06-20 04:21:40 2008-06-20 05:53:11 bus+walk
1 62 2008-06-21 04:23:39 2008-06-21 05:43:20 bus
2 62 2008-07-13 05:45:27 2008-07-13 06:02:54 bus
3 62 2008-07-13 06:47:57 2008-07-13 07:20:19 bus
4 62 2008-07-14 09:08:06 2008-07-14 09:17:15 taxi
5 62 2008-07-14 13:12:46 2008-07-14 13:30:43 bus
https://stackoverflow.com/questions/72603484
复制相似问题