【发布时间】:2021-10-26 22:21:42
【问题描述】:
我有两个数据框。一个包含用户订阅数据,另一个包含用户会话数据。
订阅数据示例(df_subscriptions):
user_id created ended
10238 140baa7a-1641-41b5-a85b-c43dc9e12699 2021-08-13 19:37:11.373039 2021-09-12 19:37:11.373039
10237 fbfa999c-9c56-4f06-8cf9-3c5deb32d5d2 2021-08-13 15:25:07.149982 2021-09-12 15:25:07.149982
6256 a55e64b0-a783-455e-bd9d-edbb4815786b 2021-08-13 18:31:36.083681 2021-09-12 18:31:36.083681
6257 ca2c0ee1-9810-4ce7-a2ec-c036d0b8a380 2021-08-13 16:29:52.981836 2021-09-12 16:29:52.981836
7211 24378efd-e821-4a51-a3e6-39c30243a078 2021-08-13 19:58:19.434908 2021-09-12 19:58:19.434908
会话数据示例:
user_id session_start session_duration
11960653 6f51df1a-8c2b-4ddb-9299-b36f250b05dc 2020-01-05 11:39:29.367 165.880005
80076 697e1c0a-c026-4104-b13f-1fd74eec5890 2021-01-31 02:16:33.935 22.883301
1577621 02b23671-8ce3-452b-b551-03b5ea7dce47 2021-05-18 02:07:32.589 4.283300
1286532 a506fb53-3505-44db-880a-27ad483151f0 2020-07-29 16:47:51.908 51.000000
18875432 1ea77db5-fe4a-414f-ba47-1f448175df3f 2020-10-17 04:00:35.269 360.733307
我需要计算用户在订阅有效期间在服务上花费的总时间。下面的代码给了我正确/预期的结果,但在真实数据上花费了很多时间:
def sessions_during_sub (user_id, start_date, end_date):
result = df_sessions.loc[(df_sessions.user_id == user_id)&
(df_sessions.session_start >= start_date)&
(df_sessions.session_start <= end_date)].session_duration.sum()
return result
df_subscriptions['sessions'] = df_subscriptions.apply(lambda x: sessions_during_sub(x['user_id'], x['created'], x['ended']), axis=1)
有什么办法可以做到正确的熊猫方式/矢量化?关于如何真正加快速度的任何想法。
【问题讨论】:
-
您正在手动对
user_id键执行合并操作。我建议您阅读 Pandasmerge操作 (pandas.pydata.org/pandas-docs/stable/user_guide/merging.html) 以找出解决方案。如果您在尝试计算合并代码时遇到困难,也许可以关闭此问题并返回一个新问题! -
不,我没有合并 user_id 键。首先,我需要“合并”活跃用户订阅日期之间的用户会话。其次,一个用户可以有多个订阅。我在合并文档中没有找到任何允许在合并期间执行这种复杂逻辑的内容。如果我弄错了,我们将不胜感激。
-
我在一个答案中写了一些示例代码,看看你是否可以使用它。
-
请提供minimal reproducible example。您提供的样本数据与
user_id没有交集。确保您提供一个包含您面临的“每个用户多个会话”问题的最小案例。