枚举Pandas DataFrame后image_id异常,如何获取行索引?
问题原因与解决方案
你的问题根源很典型——你在循环外部定义了record字典。Python里的字典是可变对象,每次循环你只是修改同一个record的内容,然后把这个字典的引用添加到dataset_dicts列表里。等循环跑完,列表里所有元素指向的都是最后一次修改后的record,所以不管你取第几个元素,image_id都是最后一轮循环的i值(也就是总行数39208)。
修正方法
把record = dict()移到循环内部,让每次循环都创建一个全新的字典对象,这样每个列表元素都是独立的,不会互相覆盖:
def get_detectron_format(self): """Returns the dataset in the Detectron2 list(dict) format""" csv = self.get_data_csv() dataset_dicts = [] for i, (index, data) in enumerate(csv.iterrows()): # 每次循环新建一个空字典,避免引用复用 record = dict() record['file_name'] = os.path.join(self.data_root, data['Path']) record['image_id'] = i record['height'] = data['Height'] record['width'] = data['Width'] objs = [] obj= { 'bbox': [data['Roi.X1'], data['Roi.Y1'], data['Roi.X2'], data['Roi.Y2']], 'bbox_mode': BoxMode.XYXY_ABS, 'category_id': data['Roi.X1'] - 1, 'iscrowd': 0 } objs.append(obj) record['annotations'] = objs dataset_dicts.append(record) return dataset_dicts
额外小提示
另外,csv.iterrows()返回的第一个值index就是DataFrame原生的行索引,如果你想直接用这个作为image_id(比如你的CSV行号本身就是有意义的标识),可以把record['image_id'] = i改成record['image_id'] = index,根据你的实际需求选择即可。
内容的提问来源于stack exchange,提问作者Nothing here
相关产品推荐
相关产品推荐

