Python熊猫:更有效地查找其他行中某一列的最大值?

时间:2020-08-22 14:18:16

标签: python pandas performance processing-efficiency

上下文

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

.csv字段的结构如下:

  • ProcessCode(进程的标识,一个链中的ProcessDepartment可能有多个进程。虽然有些进程可能较早启动,但由于分歧而可能在以后完成-请参阅ItemNumber)
  • PredecessorProcessCode(“链”中流程previosu的ProcessCode)
  • FinishDateTime(完成过程的时间)
  • ItemStartDateTime(正在处理的项目,=“链”中的最低日期时间)
  • ProcessDepartment(流程部门)
  • ItemNumber(一个项目沿着流程分散到多个“流程链”)
  • 上一个部门(上级部门)

基本上,我想添加一个名为“ PreviousDepartmentFinishDateTime”的字段,以便能够确定流程的在制品数量,队列等。但是,“ PredecessorProcessCode”并不一定是上一个部门的结束时间,因为前任的前任可能早些开始,而后要结束。所以基本上,我的流程如下:

  1. 确定项目的前任链(这样递归查找,直到不再有前任,简单的功能)
  2. 检查上一个部门中的哪些前任(使用字典)
  3. 检查上一个部门中哪个项目的前任具有最新的FinishDateTime。
  4. 将此作为新列添加到当前Item-ProcessCode的行中

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

上一个过程的步骤3似乎太慢了。每次查询大约需要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效率高吗?我已经查找了它,但似乎无法使用它(因为.at更快,但不允许查找多行)。大部分情况下,.loc“知道在哪里查找”,据我所知,它基本上是使用ItemNumber和ProcessCode进行字典查找,但是平均需要2毫秒(这是由于4M行?)

0 个答案:

没有答案
相关问题