如何避免新增仅出现一次的操作时触发KeyError
解决单条记录Operation触发KeyError的问题
原代码的核心问题
- 全局Shift逻辑错误:原代码对整个DataFrame执行
shift(-1),会错误地将不同工序的记录关联计算间隙,导致跨工序的无效间隙被纳入计算。 - 单记录处理缺失:当某工序仅存在一条记录时,若该记录位于DataFrame末尾,
shift(-1)后start列变为NaN,计算间隙时得到NaN,idxmax()返回NaN,进而触发KeyError: nan。
修正后的代码
import pandas as pd data = [ {'order': 1, 'operation': 'milling', 'start': 0, 'end': 70}, {'order': 1, 'operation': 'milling', 'start': 200, 'end': 210}, {'order': 1, 'operation': 'milling', 'start': 500, 'end': 600}, {'order': 1, 'operation': 'grinding', 'start': 90, 'end': 150}, {'order': 2, 'operation': 'grinding', 'start': 150, 'end': 170}, {'order': 3, 'operation': 'grinding', 'start': 400, 'end': 420}, {'order': 3, 'operation': 'milling', 'start': 610, 'end': 660}, {'order': 4, 'operation': 'new_operation', 'start': 100, 'end': 200} # 新增单条记录 ] df = pd.DataFrame(data) def calculate_max_gap(group): # 组内按时间排序,保证间隙计算的顺序正确性 sorted_group = group.sort_values('start').reset_index(drop=True) # 仅在当前工序组内执行shift,获取下一道工序的开始时间 sorted_group['next_start'] = sorted_group['start'].shift(-1) # 计算相邻工序的间隙 sorted_group['gap'] = sorted_group['next_start'] - sorted_group['end'] # 处理单记录情况:若只有一条工序,无间隙,max_gap设为None(可改为0) if len(sorted_group) == 1: return pd.Series({ 'operation': group.name, 'max_gap': None, 'gap_start': None, 'gap_end': None }) # 多记录时获取最大间隙及对应的起止时间 max_gap_idx = sorted_group['gap'].idxmax() return pd.Series({ 'operation': group.name, 'max_gap': sorted_group['gap'].iloc[max_gap_idx], 'gap_start': sorted_group['end'].iloc[max_gap_idx], 'gap_end': sorted_group['next_start'].iloc[max_gap_idx] }) # 按工序分组计算最大间隙 result = df.groupby('operation').apply(calculate_max_gap).reset_index(drop=True) print(result)
运行输出
operation max_gap gap_start gap_end 0 grinding 230.0 170.0 400.0 1 milling 290.0 210.0 500.0 2 new_operation None None None
自定义调整
如果希望单条记录的max_gap显示为0而非None,只需修改函数内的单记录处理逻辑:
if len(sorted_group) == 1: return pd.Series({ 'operation': group.name, 'max_gap': 0, 'gap_start': None, 'gap_end': None })
内容的提问来源于stack exchange,提问作者question12
相关产品推荐
相关产品推荐

