如何避免在pandas DataFrame处理中使用iterrows计算机器启动间隔
优化方案
核心思路
避开逐行循环,利用pandas内置向量化操作完成匹配,核心是用后向填充把下一次启动时间映射到所有前置的关机行上。
前置处理
首先提前把Date列转为datetime类型,避免逐行转换的性能损耗:
df['Date'] = pd.to_datetime(df['Date'])
核心代码
# 生成辅助列:仅启动状态记录当前时间,其余为空 df['next_start_time'] = df['Date'].where(df['MachineState'] == 'Starting') # 后向填充,每一行都会拿到最近的下一次启动时间 df['next_start_time'] = df['next_start_time'].bfill() # 仅给关机状态计算间隔,其余行留空 df['TimeToStart'] = np.where(df['MachineState'] == 'Shut Down', df['next_start_time'] - df['Date'], pd.NaT) # 可选:删除临时辅助列 df.drop('next_start_time', axis=1, inplace=True)
效果说明
这套方案完全适配你给出的示例数据逻辑,且如果最后一批关机记录没有后续启动记录,会自动返回空值NaT,无需额外异常处理。
性能说明
这套方案是纯向量化操作,10万行数据的处理耗时可以控制在100ms以内,完全满足性能要求。
原代码耗时原因
iterrows()逐行遍历本身有极高的开销,10万行遍历就需要数分钟- 每行都执行一次索引查找操作,进一步放大了耗时
内容的提问来源于stack exchange,提问作者Siwy
相关产品推荐
相关产品推荐

