如何解决Python熊猫:更有效地查找其他行中某一列的最大值?
上下文
我有一个.csv工艺步骤,每个步骤都有一个完成日期和时间,但是它们的开始时间未知。我想确定这些流程中的项目到达部门的时间。这可以通过检查PredecessorProcessCode的“链”来计算
.csv字段的结构如下:
- ProcessCode(进程的标识,一个链中的ProcessDepartment可能有多个进程。虽然有些进程可能较早启动,但由于分歧而可能在以后完成-请参阅ItemNumber)
- PredecessorProcessCode(“链”中流程previosu的ProcessCode)
- FinishDateTime(完成过程的时间)
- ItemStartDateTime(正在处理的项目,=“链”中的最低日期时间)
- ProcessDepartment(流程部门)
- ItemNumber(一个项目沿着流程分散到多个“流程链”)
- 上一个部门(上级部门)
基本上,我想添加一个名为“ PreviousDepartmentFinishDateTime”的字段,以便能够确定流程的在制品数量,队列等。但是,“ PredecessorProcessCode”并不一定是上一个部门的结束时间,因为前任的前任可能早些开始,而后要结束。所以基本上,我的流程如下:
- 确定项目的前任链(这样递归查找,直到不再有前任,简单的功能)
- 检查上一个部门中的哪些前任(使用字典)
- 检查上一个部门中哪个项目的前任具有最新的FinishDateTime。
- 将此作为新列添加到当前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行?)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。