Pandas中如何匹配由两个独立单词组成的字符串
问题根因
原函数先将输入文本按空格拆分为单个单词组成的列表,仅能匹配刚好为单个单词的地名。多单词构成的地名本身包含空格,属于多词组合的字符串,不可能出现在拆分后的单个词列表中,因此无法命中。
代码调整方案
核心修改逻辑是取消提前拆分输入文本的步骤,直接在原始输入字符串中做子串匹配,即可支持2个及以上单词组成的地名,同时可按需补充大小写兼容、长地名优先匹配的能力,避免漏匹配、误匹配。
基础版本(严格匹配大小写)
直接遍历地名列表判断是否为输入文本的子串,无额外依赖,逻辑最简单:
# alpha_list 为存储所有国家、美国州名的预置列表 def locate_country(b): match_res = [place for place in alpha_list if place in b] return match_res df['country'] = df['locations'].apply(locate_country)
兼容大小写版本
解决输入文本和预置地名列表大小写不一致导致的匹配失败问题(比如输入为new york、列表存储为New York的场景),匹配完成后返回原始格式的地名:
# 预处理:生成对应小写格式的地名列表,用于无大小写匹配 alpha_lower = [p.lower() for p in alpha_list] def locate_country(b): b_low = b.lower() match_res = [] for idx, p_low in enumerate(alpha_lower): if p_low in b_low: match_res.append(alpha_list[idx]) return match_res df['country'] = df['locations'].apply(locate_country)
防误匹配优化版本
如果存在短地名是长地名子串的场景(比如同时存在地名york和new york),可以先将地名按词数从多到少排序,优先匹配长地名,避免短词提前误命中:
# 按地名包含的单词数降序排序,长地名优先参与匹配 alpha_sorted = sorted(alpha_list, key=lambda x: len(x.split()), reverse=True) alpha_lower = [p.lower() for p in alpha_sorted] def locate_country(b): b_low = b.lower() match_res = [] for idx, p_low in enumerate(alpha_lower): if p_low in b_low: match_res.append(alpha_sorted[idx]) return match_res df['country'] = df['locations'].apply(locate_country)
内容的提问来源于stack exchange,提问作者work_python
相关产品推荐
相关产品推荐

