gpt4 book ai didi

python - 优化比较 DataFrame 的 Pandas 函数

转载 作者:行者123 更新时间:2023-12-01 09:28:44 25 4
gpt4 key购买 nike

我有交易日志,记录信息亭机器的使用情况和另一组机器在线/离线时间的日志。事务日志包含一个日期时间字段,可让您知道事务(或 session )发生的时间。

    event_date  raw_data1   session_id  ws_id
0 2017-11-06 12:13:06 {'description': 'Home'} 0604e80d-1ae6-48d0-81bf-32ca1dc58e4c machine2
1 2017-11-06 12:13:41 {'description': 'AreYouStillThere'} 0604e80d-1ae6-48d0-81bf-32ca1dc58e4c machine2
2 2017-11-06 12:14:09 {'description': 'AttractiveAnimation'} 0604e80d-1ae6-48d0-81bf-32ca1dc58e4c machine2
3 2017-11-07 10:06:15 {'description': 'Home'} e2e7565f-60b4-4e7b-a8f0-d0a9c384b283 machine13
4 2017-11-07 10:06:27 {'description': 'AuthenticationPanelAdmin'} e2e7565f-60b4-4e7b-a8f0-d0a9c384b283 machine13

该函数的目标是查看哪些session_ids与离线日志一致

    dtrange start   end status  machine_id
0 DateTimeTZRange(datetime.datetime(2017, 11, 17... 2017-11-17 14:46:15 2017-11-17 15:01:15 2 12
1 DateTimeTZRange(datetime.datetime(2017, 11, 17... 2017-11-17 14:47:02 2017-11-17 15:02:02 2 22
2 DateTimeTZRange(datetime.datetime(2017, 11, 17... 2017-11-17 14:47:23 2017-11-17 15:02:23 2 18
3 DateTimeTZRange(datetime.datetime(2017, 11, 17... 2017-11-17 14:48:09 2017-11-17 15:03:09 2 17
4 DateTimeTZRange(datetime.datetime(2017, 11, 17... 2017-11-17 14:49:18 2017-11-17 15:04:18 2 15

ws_id 和 machine_id 相同,这使得它有点棘手,因为 session 时间和 machine_id 必须在两个数据帧之间匹配。

这是我用来返回机器离线时发生的所有 session_ids 的代码。它使用事务数据帧中的每一行过滤离线数据帧,如果离线事件与 session 时间一致,则返回 session_id:

def CheckSession(machinename, sessiontime, sessionid):
if len(offlinedf[(offlinedf.start<sessiontime)
&(offlinedf.end>sessiontime)
&(offlinedf.name==machinename)])>0:
return sessionid

sessions = df.apply(lambda row: CheckSession(row["name"], row["created_at1"], row["session_id"]), axis=1)

这会构建 session 列表,但速度非常慢并且数据帧非常大。我仍在学习如何最好地使用 pandas 库 - 我希望使用一些矢量化来优化它,但一直无法弄清楚如何以这种方式构建它。

最佳答案

考虑merging dfofflinedfname,然后使用 query 进行过滤根据你的函数内部的逻辑。然后将过滤后的数据帧的 sessionid 列转换为列表。

session_df = df.merge(offlinedf, on='name', suffixes=['', '_'])\
.query('start < created_at1 & end > created_at1')

sessions = session_df['sessionid'].tolist()

在任何数据分析工作中,对象的分块处理都比迭代行处理更好。

关于python - 优化比较 DataFrame 的 Pandas 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50136587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com