You need to enable JavaScript to run this app. 如何使用Pandas向空DataFrame追加行?解决缺失行导出空CSV问题
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.13 14:24:05