从两个pandas DataFrame生成Python字典,代码仅首行生效如何解决
问题解决方法
出错原因
- 直接遍历DataFrame对象
image_files时,默认返回的是列名而非行内容,你的数据集只有1列,所以原循环只会执行1次,只会处理第一行数据。 file.iterrows()返回的是(行索引, 行Series对象)的元组,原代码直接将整个元组转数组,会把索引也计入结果,不符合标注数据要求。- 额外提示:Python原生字典不支持重复键,你预期输出里的重复键结构无法用普通字典实现,后续写入会覆盖之前的同键值对。
修复代码
方案1:同一路径的标注合并为嵌套列表(推荐,符合字典规范)
import pandas as pd import numpy as np # 读取无表头的csv需加header=None,避免第一行数据被识别为列名 image_files = pd.read_csv('image_files.csv', header=None) file = pd.read_csv('Training_dataset.csv', header=None) image_anno_dict = {} for img_tuple, (_, anno_row) in zip(image_files.itertuples(index=False, name=None), file.iterrows()): img_path = img_tuple[0] anno_list = anno_row.tolist() if img_path in image_anno_dict: image_anno_dict[img_path].append(anno_list) else: image_anno_dict[img_path] = [anno_list]
输出格式示例:
{ 'C:/Users/.../000005.jpg': [[324,339,263,211,9], [253,372,165,264,9], ...], 'C:/Users/.../000007.jpg': [...], ... }
方案2:保留重复键结构(用元组列表实现,无法用普通字典)
如果一定要保留你预期的多组同键结构,可以用列表存储键值对元组:
import pandas as pd import numpy as np image_files = pd.read_csv('image_files.csv', header=None) file = pd.read_csv('Training_dataset.csv', header=None) image_anno_list = [] for img_tuple, (_, anno_row) in zip(image_files.itertuples(index=False, name=None), file.iterrows()): img_path = img_tuple[0] anno_list = anno_row.tolist() image_anno_list.append((img_path, anno_list))
输出格式示例:
[ ('C:/Users/.../000005.jpg', [324,339,263,211,9]), ('C:/Users/.../000005.jpg', [253,372,165,264,9]), ... ]
内容的提问来源于stack exchange,提问作者Yaman Afadar
相关产品推荐
相关产品推荐

