YOLOv5预测结果处理:用concat替代append是否可行?
问题解答
首先明确:在你这个场景下,用concat替代append不仅有意义,而且是必须的——因为pandas从2.0版本开始已经标记append方法为弃用状态,未来版本会直接移除这个API,现在靠忽略警告只是临时方案,早迁移早避免后续兼容性问题。
逐行迭代场景下的concat替代写法
你原来的代码每次循环都用append拼接DataFrame,这种写法本身效率极低(每次拼接都会重新创建新的DataFrame对象,内存和时间消耗都大)。用concat替代的正确姿势是先把符合条件的行收集到列表,最后一次性拼接,而非逐次循环拼接:
pred0 = car_model(frame, augment=False) results_df = pred0.pandas().xyxy[0] # 先把预测结果转成DataFrame存起来,避免重复调用 filtered_rows = [] for _, row in results_df.iterrows(): if row['confidence'] > confidence: filtered_rows.append(row) # 最后一次性拼接所有符合条件的行 pred_df = pd.DataFrame(filtered_rows) if filtered_rows else pd.DataFrame()
更优的方案:放弃逐行迭代,用pandas布尔索引直接筛选
其实你完全没必要逐行迭代——pandas的核心优势就是向量化操作,直接用布尔索引筛选比循环高效得多,代码也更简洁:
pred0 = car_model(frame, augment=False) results_df = pred0.pandas().xyxy[0] # 直接用布尔条件筛选置信度符合要求的行 pred_df = results_df[results_df['confidence'] > confidence].reset_index(drop=True)
这种写法既避免了append的弃用警告,又彻底解决了循环迭代的性能问题,是pandas的标准用法。
总结
- 不管用哪种方式,都应该替换掉
append,避免未来版本的兼容性问题; - 逐行迭代场景下,「先收集列表再一次性concat」的写法,比逐次拼接高效;
- 优先选择布尔索引的向量化筛选,这才是最符合pandas设计理念的写法,性能和可读性都更好。
内容的提问来源于stack exchange,提问作者potato
相关产品推荐
相关产品推荐

