如何使用Pandas向空DataFrame追加行?解决缺失行导出空CSV问题
问题根因与修正方案
核心问题原因
- 最关键的错误:pandas 的
append方法不会原地修改原DataFrame,它只会返回一个拼接完成的新DataFrame对象。原代码中写not_found_images.append(row, ignore_index=True),没有把这个返回的新对象重新赋值给not_found_images变量,相当于执行了拼接操作但直接丢弃了结果,原not_found_images从初始化开始就一直是空DataFrame,导出的CSV自然没有数据。 - 附带的逻辑隐患:在
iterrows()遍历原DataFrame的过程中,直接用inplace=True删除原表的行,很容易出现索引错位、漏遍历行的问题——iterrows是基于遍历启动时的索引快照运行的,中途修改原表结构会导致后续的遍历逻辑不符合预期,哪怕图片校验正确,也可能漏抓缺失图片的行。
最小改动的修正代码
按照最小修改量的原则,调整逻辑为“遍历过程只做记录、不直接修改原表,遍历完成后统一做删除操作”,同时修正append的赋值逻辑:
filename2 = 'images_not_found.csv' orders_csv = pd.read_csv(path + filename) # 初始化空的缺失图片记录DataFrame not_found_images = pd.DataFrame() # 收集需要删除的行索引 drop_index_list = [] for index, row in orders_csv.iterrows(): if not os.path.isfile(row['Image']): # 把索引存进待删除列表 drop_index_list.append(index) # 接收append返回的新DataFrame,完成重新赋值 not_found_images = not_found_images.append(row, ignore_index=True) # 遍历结束后统一删除不需要的行 orders_csv = orders_csv.drop(drop_index_list) orders_csv.to_csv(path + filename, index=False) not_found_images.to_csv(path + filename2, index=False)
注意:较新版本的pandas已经将
DataFrame.append()标记为废弃,后续版本会逐步移除该方法,建议替换为兼容性更好的pd.concat实现拼接,把循环内的拼接行替换为:not_found_images = pd.concat([not_found_images, pd.DataFrame([row])], ignore_index=True)
性能更优的实现方式
当DataFrame数据量较大时,逐行iterrows的运行效率很低,可以替换为向量化判断逻辑,彻底避免循环和遍历错位问题,注意拆分数据的顺序不能颠倒,避免布尔掩码和数据长度不匹配的报错:
# 对图片列批量做存在性校验,生成布尔掩码 image_exist_mask = orders_csv['Image'].apply(os.path.isfile) # 先取出所有图片不存在的行存入新DataFrame not_found_images = orders_csv[~image_exist_mask].reset_index(drop=True) # 再筛选出图片存在的行更新原DataFrame orders_csv = orders_csv[image_exist_mask].reset_index(drop=True)
内容的提问来源于stack exchange,提问作者Jason G
相关产品推荐
相关产品推荐

