Python:更有效地查找其他行中的最大列数?

2024-10-02 00:36:19 发布

您现在位置:Python中文网/ 问答频道 /正文

上下文

我有一个.csv流程步骤,每个步骤都有一个完成日期&;时间,但它们的开始时间未知。我想确定这些流程中的项目到达部门的时间。这可以通过检查PredecessorProcessCode的“链”来计算

因此.csv字段的结构如下所示:

  • ProcessCode(流程标识符,在一个链中的ProcessDepartment中可能有多个流程。虽然有些流程可能会更早开始,但由于分歧,它们可能会更晚完成-请参阅ItemNumber)
  • 前置进程代码(“链”中的前置进程的进程代码)
  • FinishDateTime(进程完成的时间)
  • ItemStartDateTime(进程中项目的到达,=链中的最低日期时间)
  • 工艺部门(工艺部门)
  • ItemNumber(一个项目沿着流程发散到多个“流程链”)
  • 前置部门(前置部门)

基本上,我想添加一个名为“PreviousDepartmentFinishDateTime”的字段,以便能够确定在制品数量、队列等。。对于流程。但是,“PredecessorProcessCode”不一定是前一个部门的完成时间,因为前一个部门的前一个部门可能开始得更早,而完成得更晚。基本上,我现在的过程如下:

  1. 确定项目的前置链(因此递归地查找,直到不再有前置链,即简单函数)
  2. 检查哪些前任在以前的部门(使用dict)
  3. 检查项目的哪个前置项在前一部门具有最新的FinishDateTime
  4. 将其作为新列添加到当前项目ProcessCode的行中

现在,我的问题是: 我已经加载了400万行,并且能够决定添加“PreviousDepartmentFinishDateTime”列,但是每秒只有大约500行,这意味着我现在要等待2个多小时才能添加新列。我必须提高这个过程的速度,因为我们打算“在线”使用它

第三步。前一个过程的速度似乎太慢了。每次查找大约需要2毫秒,导致等待时间过长

我现在有了一个带有多索引ItemNumber-ProcessCode的df

代码片段如下所示:

def prev_department_finished(row): itemno, processcode = row.name processcode_predecessors = processesbefore(processcode) prevdepartment = row['PrevDepartment'] df_subset = df.loc[itemno].query('Department == @prevdepartment & ProcessCode in processcode_predecessors')['FinishDateTime'] if df_subset.empty: #if no preceding department return row['ItemStartDateTime'] else: return df_subset.max() df['PrevDepartmentDone'] = df.apply(prev_department_finished, axis=1)

因此,我的主要问题是:

  • 使用.loc是否有效?我已经查过了,但似乎无法绕开使用(as.at更快,但不允许查找多行)。在大多数情况下,loc‘知道去哪里找’,因为据我所知,它基本上是通过ItemNumber&;然而,处理代码平均需要2毫秒(这是因为4百万行吗??)

Tags: 项目代码df进程过程时间流程row

热门问题