You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

枚举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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:47:50