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

如何基于含多俗名的物种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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:43:10