如何将DataFrame转换为字典实现按ID查询对应5条图片描述
现有代码问题说明
- 重复打印全量记录:你用的
df['Description'].where()方法会返回和原数据集长度一致的序列,匹配失败的位置填充为NaN,不会只返回匹配到的单条结果,所以每次循环都会打印全部16万行的内容,不匹配的行显示NaN - 短ID查询报错:大概率是精确匹配时输入ID不存在对应记录,或者拼接后无匹配项导致的输出异常
方案1:优化pandas代码(无需转字典,改动量最小)
不需要循环查询5次,直接用前缀匹配一次性筛选出对应ID的所有描述即可,代码如下:
import pandas as pd df = pd.read_csv('results.txt', delimiter="\t") input_id = input('Enter the ID: ').strip() # 筛选所有Image_ID以输入ID加.jpg#开头的记录 match_result = df[df['Image_ID'].str.startswith(f"{input_id}.jpg#")]['Description'] if len(match_result) > 0: for i, desc in enumerate(match_result, 1): print(f"描述{i}:{desc}") else: print("未找到对应ID的描述,请检查输入是否正确")
方案2:转换为字典实现(查询效率更高,适合频繁查询场景)
先明确字典的核心逻辑:字典是键(key):值(value)的映射结构,我们这里把基础ID作为唯一key,把该ID对应的5条描述组成的列表作为value,查询时只需输入key就能直接取出对应的所有描述,查询速度远高于pandas遍历筛选。
转换+查询代码如下:
import pandas as pd df = pd.read_csv('results.txt', delimiter="\t") # 提取每条记录的基础ID(即Image_ID中.jpg#前面的部分) df['base_id'] = df['Image_ID'].str.split('.jpg#').str[0] # 按基础ID分组,把同个ID的所有描述拼成列表,转换为字典 id_desc_dict = df.groupby('base_id')['Description'].apply(list).to_dict() # 查询逻辑 input_id = input('Enter the ID: ').strip() if input_id in id_desc_dict: for i, desc in enumerate(id_desc_dict[input_id], 1): print(f"描述{i}:{desc}") else: print("未找到对应ID的描述,请检查输入是否正确")
内容的提问来源于stack exchange,提问作者hvssvvn
相关产品推荐
相关产品推荐

