使用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
相关产品推荐
相关产品推荐

