如何判断DataFrame的Code列值是否为另一DataFrame的City列子串并新增exists列
解决DataFrame中子串匹配生成exists列的问题
问题原因
你使用的df1["Code"].isin(df2["City"])是精确匹配逻辑,它只会检查Code列的完整值是否完全等于df2 City列中的某一项。比如don和Paris/London等City值都不相等,所以返回全False,但你需要的是子串包含匹配——判断Code值是否是某个City字符串的一部分。
正确实现代码
可以用apply结合any()实现子串检查,逻辑清晰且易理解:
# 先把df2的City列转为列表,方便后续遍历检查 city_list = df2["City"].tolist() # 为df1新增exists列,判断每个Code是否是任意City的子串 df1["exists"] = df1["Code"].apply(lambda code: any(code in city for city in city_list))
执行后得到的df1与期望结果一致:
| name | family-name | Code | exists |
|---|---|---|---|
| John | heath | don | True |
| Eric | Miles | ork | True |
| Duke | Bravo | brr | False |
| James | Mac | ris | True |
| Alec | Blunt | jjh | False |
大数据量优化方案
如果数据集规模较大,上面的遍历方法效率偏低,可以用向量化的正则匹配方案提升性能:
# 生成匹配所有Code子串的正则模式,用|分隔不同匹配项 pattern = '|'.join(df1["Code"]) # 从所有City中提取出包含的Code子串,去重后得到匹配集合 matched_codes = df2["City"].str.extract(f'({pattern})', expand=False).dropna().unique() # 最后用isin判断Code是否在匹配集合中 df1["exists"] = df1["Code"].isin(matched_codes)
内容的提问来源于stack exchange,提问作者user17312322
相关产品推荐
相关产品推荐

