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

使用map函数匹配存在的字典键时返回NaN值的问题求助

解决思路
  • 排查字符串格式不匹配问题
    直接查字典能拿到值,但map/merge返回NaN,大概率是df1的Drug IDs列值和字典键存在肉眼不可见的差异:

    • 处理前后空格:对两列分别执行str.strip(),清洗后再生成映射和执行map
    • 统一大小写:用str.upper()(或str.lower())把所有ID转成统一格式,避免大小写不一致导致匹配失败
    • 查看隐藏字符:用repr()函数对比具体值,确认是否存在全角/半角、不可见控制字符等问题:
      # 查看df1中问题ID的原始内容
      print(repr(df1.loc[df1['Drug IDs'].str.contains('DB11118', na=False), 'Drug IDs'].iloc[0]))
      # 查看字典中对应键的原始内容
      print(repr('DB11118'))
      
  • 验证ID集合的交集
    用集合运算确认清洗后的ID是否真的在映射字典中:

    # 先清洗两列的ID
    df1_ids_clean = set(df1['Drug IDs'].str.strip().str.upper().dropna())
    mapping_keys_clean = set(k.strip().upper() for k in drugbank_mapping.keys())
    # 查看df1中存在但映射里没有的ID
    print(df1_ids_clean - mapping_keys_clean)
    # 查看映射里有但df1没有的ID
    print(mapping_keys_clean - df1_ids_clean)
    

    如果问题ID不在第一个集合差里,说明清洗后已经匹配上。

  • 重新生成清洗后的映射字典
    生成字典前先对id_converter做清洗和去重(避免同一个ID对应多个值导致映射混乱):

    # 清洗映射表的ID列
    id_converter_clean = id_converter.copy()
    id_converter_clean['DrugBank ID of Ligand'] = id_converter_clean['DrugBank ID of Ligand'].str.strip().str.upper()
    # 去重,保留第一个出现的ID-名称映射
    id_converter_clean = id_converter_clean.drop_duplicates(subset='DrugBank ID of Ligand', keep='first')
    # 生成新的映射字典
    drugbank_mapping_clean = dict(id_converter_clean[['DrugBank ID of Ligand', 'DrugName']].values)
    
    # 清洗df1的ID列并执行map
    df1['Drug IDs_clean'] = df1['Drug IDs'].str.strip().str.upper()
    df1['Drug IDs_name'] = df1['Drug IDs_clean'].map(drugbank_mapping_clean)
    
  • 排查merge的问题
    merge时同样要先清洗列,指定正确的连接键和连接方式:

    merged_df = pd.merge(
        df1.assign(Drug_IDs=df1['Drug IDs'].str.strip().str.upper()),
        id_converter_clean,
        left_on='Drug_IDs',
        right_on='DrugBank ID of Ligand',
        how='left'
    )
    

    若仍有缺失值,检查对应行的DrugBank ID of Ligand是否真的存在于id_converter_clean中。

  • 检查列数据类型
    确保df1的Drug IDs和id_converter的DrugBank ID of Ligand都是字符串类型(object dtype),如果是数值类型,先转成字符串:

    df1['Drug IDs'] = df1['Drug IDs'].astype(str)
    id_converter['DrugBank ID of Ligand'] = id_converter['DrugBank ID of Ligand'].astype(str)
    

内容的提问来源于stack exchange,提问作者Ssong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 05:58:39