如何基于含多俗名的物种DataFrame构建匹配字典映射至目标DataFrame
野生动物康复中心动物俗名匹配学名解决方案
问题背景
我管理着野生动物康复中心的动物数据,每只动物记录有唯一ID和俗名(Common_name),需要为这些俗名匹配对应的物种学名(Species)。官方提供的哺乳动物、鸟类物种列表为DataFrame格式,每个物种对应多个俗名,之前尝试直接用zip构建字典映射、正则分割俗名都无法完成有效匹配,且数据量达35000条,无法手动处理。
示例数据
import pandas as pd my_list = pd.DataFrame({'ID':[300,301,302,303,304,305] ,'Common_name':['North American opossum','Cougar','Virginia opossum','Common pigeon','Black vulture','Elk']}) mammal_list = pd.DataFrame({'Species':['Didelphis virginiana','Ursus arctos','Puma concolor'],'Common_name':['North American opossum, Virginia opossum','Brown bear, Grizzly bears','North American cougar, Cougar, Puma, Mountain lion']}) birds_list = pd.DataFrame({'Species':['Anser caerulescens','Columba livia','Coragyps atratus'],'Common_name':['Snow goose,Blue goose','Rock dove, Rock pigeon, Common pigeon','Black vulture, American black vulture, Mexican vulture']})
预期结果
为my_list新增Species列,匹配不到的填充<NA>:
my_list = pd.DataFrame( {'ID':[300,301,302,303,304,305], 'Common_name':['North American opossum','Cougar','Virginia opossum','Common pigeon','Black vulture','Elk'], 'Species':['Didelphis virginiana','Puma concolor', 'Didelphis virginiana','Columba livia','Coragyps atratus', pd.NA]} )
可行解决方案
核心思路是将官方列表中每个物种对应的多俗名拆分为单独行,构建俗名-学名的一对一映射关系,再批量匹配原始数据。
步骤1:合并官方列表并拆分多俗名
先合并哺乳动物和鸟类列表,再将每个物种的多俗名字符串按逗号(含前后空格)分割,展开为单独行,同时保留对应学名:
# 合并官方物种列表 official_list = pd.concat([mammal_list, birds_list], ignore_index=True) # 拆分多俗名(处理逗号前后的空格)并展开成单独行 official_list['Common_name'] = official_list['Common_name'].str.split(r',\s*') expanded_list = official_list.explode('Common_name', ignore_index=True)
步骤2:构建俗名到学名的映射字典
从展开后的列表中提取键值对,确保每个俗名对应唯一学名(若存在冲突俗名,需提前排查处理):
# 构建映射字典,重复俗名将保留最后一次出现的学名,可根据需求调整 name_to_species = expanded_list.set_index('Common_name')['Species'].to_dict()
步骤3:批量匹配原始数据
使用map方法快速为原始数据匹配学名,匹配失败的自动填充pd.NA:
# 新增Species列 my_list['Species'] = my_list['Common_name'].map(name_to_species)
关键细节提示
- 拆分时用正则
r',\s*'处理逗号后的空格,避免出现带前导/尾随空格的无效俗名; - 若存在同一俗名对应多个学名的冲突,可通过
expanded_list.groupby('Common_name')['Species'].nunique()排查,再根据业务规则选择保留的学名; - 该方法基于pandas向量操作,处理35000条数据性能无压力。
内容的提问来源于stack exchange,提问作者Carla Lino
相关产品推荐
相关产品推荐

