如何解决Pandas匹配子串时空格、特殊字符导致识别失败的问题
问题解答
1 代码调整方案
核心思路:对匹配双方做统一的归一化处理,消除空格、特殊符号、大小写的差异,再做子串匹配。同时先修复原有代码的显性bug:app_list中Amazon Prime Video后漏写逗号,导致和后一项Google Photos拼接为单个字符串,匹配失效。
修正后的完整可运行代码如下:
import pandas as pd import numpy as np import re # 字符串归一化函数:移除所有非字母数字字符,统一转小写 def normalize_str(s): return re.sub(r'[^a-z0-9]', '', s.lower()) data = ['-Net flix_ios_App-"', '--You_tube_', '..Tik_Tok_5dgj_USA', '-AmazonMusic: Songs& Podcast_95ikj_eu', 'My FitnessPal_Fds34', 'Tidalmusic_ios_and', '--AmazonPrime_)ofi9_aus', '--AS_Googlephotos_43ks_id3'] df = pd.DataFrame(data, columns=["campaign_name"]) # 修复原app_list漏写逗号的bug app_list = ['Netflix', 'YouTube', 'TikTok', 'Amazon Music: Songs & Podcasts', 'MyFitnessPal', 'Tidal Music', 'Amazon Prime Video', 'Google Photos'] # 生成归一化后的匹配关键词列表 norm_app_keywords = [normalize_str(app) for app in app_list] # 提前对campaign_name做归一化,避免循环中重复计算 norm_campaign = df["campaign_name"].apply(normalize_str) # 生成匹配条件 match_conditions = [norm_campaign.str.contains(keyword) for keyword in norm_app_keywords] df["new_name"] = np.select(match_conditions, app_list, default="New app")
运行后所有案例均可正确匹配:比如--AmazonPrime_)ofi9_aus归一化后为amazonprimeofiaus,可命中Amazon Prime Video归一化后的关键词amazonprimevideo;--AS_Googlephotos_43ks_id3归一化后为asgooglephotos43ksid3,可命中Google Photos归一化后的关键词googlephotos。
2 两种实现方式对比
np.select的方案明显更优,核心原因有2点:
- 可维护性更强:如果后续需要新增/删除匹配的app,只需要修改
app_list即可,不需要调整逻辑结构;嵌套np.where每加一个匹配项就要多套一层,超过3层之后可读性极差,很容易出现括号配对错误。 - 性能差异极小:两者底层都是向量化运算,运行效率几乎没有差别,但是
np.select的代码更简洁清晰,符合Python可读性优先的编码规范。
内容的提问来源于stack exchange,提问作者doubledribble
相关产品推荐
相关产品推荐

