Pandas实现跨数据集链接子串匹配并生成1/0标记列
原代码存在的问题
- 语法错误:
else分支后缺少Python语法要求的冒号,代码直接运行会抛出语法异常。 - 核心逻辑错误:遍历df2链接的过程中,每次判断都会覆盖
contains变量的取值,最终返回的是最后一条链接的匹配结果,而非“任意链接匹配即返回1”的需求。例如ID=1的Page Link,前两条链接可以匹配,但遍历到第三条不匹配的链接时,contains会被覆盖为0,最终返回错误结果。 - 正则使用风险:直接将原始链接传入
re.search作为正则模式,链接中包含的.、/、?等字符会被识别为正则元字符,可能导致误匹配、漏匹配问题。
正确实现代码
优先用原生子串判断实现,无需引入正则,性能更好也不会有转义问题:
# 提前把待匹配链接转为列表,减少apply过程中的重复取数开销 target_links = df2['Link'].tolist() def get_contains_value(page_link): for link in target_links: # 只要匹配到任意子串,直接返回1,终止循环 if link in page_link: return 1 # 所有链接都不匹配时返回0 return 0 df1['Contains'] = df1['Page Link'].apply(get_contains_value)
如果必须使用正则实现,需要先对链接做正则转义处理:
import re target_links = [re.escape(link) for link in df2['Link']] def get_contains_value_re(page_link): for pattern in target_links: if re.search(pattern, page_link): return 1 return 0 df1['Contains'] = df1['Page Link'].apply(get_contains_value_re)
运行后得到的结果完全符合预期:
| ID | Page Link | Contains |
|---|---|---|
| 1 | http://example1/path1/ru/path2/path3 | 1 |
| 2 | https://example2.com/path1 | 1 |
| 3 | https://example3.subdomain | 0 |
其他业务代码注意事项
你提到的leads['Marketing Team']=leads['Page Link'].apply(assign_marketing)代码,只要assign_marketing函数满足「输入单个Page Link值,返回对应营销团队归属值」的要求,且不存在本次出现的循环覆盖返回值、语法缺失问题,即可正常运行。编写apply类自定义函数时,建议匹配到目标结果后直接return终止后续逻辑,避免无效遍历和变量覆盖问题。
内容的提问来源于stack exchange,提问作者Demi
相关产品推荐
相关产品推荐

