如何匹配员工地址与办公地点并提取employee_id与location?
解决Pandas模糊匹配办公地点与员工地址的问题
现有两个Pandas DataFrame:
办公地点数据:
import pandas as pd office = pd.DataFrame({'office_id': [1,2,3], 'location': ['Denver','Sacramento','Phoenix']})
员工数据(注意修正原代码中employee_id的格式,需改为字符串):
employee = pd.DataFrame({'employee_id': ['A1','B3','C2','D2'], 'name':['Anthony','Benjamin','Charles','Daniel'], 'address': ['123, Sacramento, California','Denver456, Colorado','Phoenix, Arizona','789 Dover']})
需求是从员工地址中匹配对应的办公地点,提取符合条件的employee_id和location,预期结果如下:
employee_id location A1 Sacramento B3 Denver C2 Phoenix
解决方案
你之前的代码仅判断了地址是否包含办公地点,但未提取具体匹配的地点,以下两种方法可以解决这个问题:
方法一:使用apply自定义匹配函数
先提取办公地点列表,再通过自定义函数遍历地址,返回匹配的地点:
# 获取所有办公地点 office_locs = office['location'].tolist() # 定义函数:从地址中提取匹配的办公地点 def match_location(address): for loc in office_locs: if loc in address: return loc return None # 给employee新增匹配到的办公地点列 employee['location'] = employee['address'].apply(match_location) # 过滤掉未匹配的记录,提取目标列 result = employee[employee['location'].notna()][['employee_id', 'location']]
方法二:使用正则表达式str.extract(更简洁)
将办公地点拼接成正则匹配模式,直接从地址中提取匹配项:
# 拼接正则匹配模式:匹配任意一个办公地点 loc_pattern = '|'.join(office['location']) # 从地址中提取匹配的办公地点 employee['location'] = employee['address'].str.extract(f'({loc_pattern})', expand=False) # 过滤并提取结果 result = employee[employee['location'].notna()][['employee_id', 'location']]
执行上述任意一种方法后,result就是你需要的预期结果。
内容的提问来源于stack exchange,提问作者Arthur
相关产品推荐
相关产品推荐

