首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >熊猫的用户出行分析

熊猫的用户出行分析
EN

Stack Overflow用户
提问于 2022-06-13 13:13:09
回答 1查看 50关注 0票数 1

我有一个数据,包括用户的旅行和旅行方式用于完成旅行。在原始的trips文件中,有些旅行实际上是一次旅行,但是由于用户改变旅行模式或停留几分钟而分成2次旅行。我想对一定时期内的旅行次数进行分析,但显然不喜欢一次两次,因此我需要一种方法来识别这类旅行,并且只计算一次。

例如,考虑这个示例dataframe (从原始文件中提取):

代码语言:javascript
运行
复制
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']
})

因此:

代码语言:javascript
运行
复制
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.
  • the第三次旅行在04.35结束,第四次旅行开始于04.47。我们认为这是一次旅行,因为中间时间不到20分钟.也许用户经历了12分钟的数据日志记录,然后continued.
  • the第五次旅行在06:02结束,第六次旅行开始于06:47。我们认为这是两个分开的旅行,因为时间间隔超过了20-minutes.
  • the,第八次旅行结束在13.20,第九次旅行开始于13.24。这也是一次旅行。--

在给定的示例中,此用户涵盖6-distinct trips,否则可能被错误地计算为9-trips。我有超过50个不同的用户涵盖了几次旅行,因此这可能导致严重错误的旅行分析。

如果时间间隔小于20分钟,我们将连续2次用户行程视为一次行程。

我不知道如何用熊猫对不同的旅行进行分析。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-13 13:27:19

您可以将每个组的结束移动并计算到下一个开始。然后使用它计算组:

代码语言:javascript
运行
复制
# 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

产出:

代码语言:javascript
运行
复制
   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

汇总数据:

代码语言:javascript
运行
复制
(df
 .groupby(group)
 .agg({'user': 'first', 'start': 'first', 'end': 'max',
       'mode': lambda x: '+'.join(set(x))})
)

产出:

代码语言:javascript
运行
复制
   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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72603484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档