如何在Python中使嵌套for循环更快,或者使用更有效的替代方法?

问题描述 投票:0回答:1

首先,我提前为下面的格式表示歉意,对于我的一生,我无法弄清楚如何让这个表单接受我的代码,它不断地推送一个错误,我似乎没有格式化我的一些代码正确,但我找不到格式错误。

对于这个问题,我有两个数据集需要迭代,

数据集一包含两列,第一列是唯一标识号(ID)。第二列保存每个识别号的数据框。

每个 ID Data Fame 包含一个 Date 列和一个 Status 列,默认设置为 1(代表 false)

数据集二包含 ID 列以及开始日期和结束日期。

最终结果是迭代拉取其数据框的唯一 ID,并检查列出的每个日期是否是数据集二中具有匹配 ID 的对应事件。如果存在,则检查当前日期是否在开始日期和结束日期之间,如果是,则将 1 更改为 0(代表 True)

我需要返回的是数据集,其中每个唯一 ID 的数据框设置为显示哪些日期发生了该 ID 的事件。

数据集一个示例,命名法对于下面的代码并不完全准确

索引 身份证 状态
0 1 [日期栏、状态栏]
1 2 [日期栏、状态栏]
2 3 [日期栏、状态栏]

数据集二示例,命名法对于下面的代码并不完全准确

索引 身份证 开始日期 结束日期
0 1 日期 日期
1 2 日期 日期
2 3 日期 日期
3 2 日期 日期
4 4 日期 日期
5 1 日期 日期

我可以让下面的代码工作,它返回我正在寻找的内容,问题是扩展。我有超过 20,000 个 ID、180,000 个单独事件,需要检查五年的日期以确定每天该 ID 是否有事件。

我当前使用的是嵌套循环和我定义的一些用于进行逻辑检查的函数。如果我只输入几行,它就可以工作,但是当我尝试运行完整的数据集时,它需要几个小时(在手动停止之前我让它运行了 12 个多小时,我从来没能让它运行完成)

我已经阅读了使用 where() 或 mask() 并尝试将 apply() 与数据框一起使用,但无法弄清楚如何传递正确的索引以获得所需的结果。

我也读过向量化,但我对 python 仍然太新且缺乏经验,无法理解如何应用于这个问题。不过,两者都应该是可行的,并且比使用 python for 循环快几个数量级。

我错过了什么吗?有没有一种简单的方法可以迭代数据帧,而不需要 for 循环所需的长时间处理时间。

    def check_ID(id, id_event):
    
      cs = pd.DataFrame(date_status.loc[ id:id,].drop(columns=['status']))

      event_id = pd.DataFrame(event_data.loc[ id_event:id_event,].drop(columns=['Begin Date','End Date','Consecutive_Days']))
    
      if  cs.equals(event_id):
        return(True)
      else:
        return(False)
    def is_event_true(id_index, id_event_index, date_index):

      if (date_status.loc[id_index,'status'].loc[date_index,'Date'] >= event_data.loc[id_event_index,'Begin Date'] and date_status.loc[id_index,'status'].loc[date_index,'Date'] < event_data.loc[id_event_index,'End Date']):

        return(True)

      else:  
        return(False)
    for i in date_status.index:

      for x in event_data.index:

        if check_ID(i,x):

          for y in date_status.loc[i,'status'].index:

            if is_event_true(i,x,y):

              date_status.loc[i,'status'].loc[y,'Status'] = 0

python performance for-loop nested-loops
1个回答
0
投票

如果您希望加快数据帧迭代速度,则需要并行化。

并行化的一些选项:

1.joblib

2.并发.futures

3.dask - 用于更大的数据

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.