Pandas筛选前缀DataFrame:仅保留电话号码列表开头匹配的前缀
解决方案
针对你提出的前缀筛选需求,这里提供3种可直接落地的实现方案,优先推荐性能最高的前缀集合匹配法:
方案1:前缀集合匹配法(性能最优,首选)
利用集合O(1)的查询特性,提前把所有手机号的全部可能前缀提取到集合中,直接用pandas向量化的isin方法过滤,30万行数据可以毫秒级完成筛选。
# 待匹配手机号列表 phone_numbers = ['316938299', '82027777', '31223459'] # 预处理:提取所有手机号的所有长度前缀存入集合 valid_prefix_set = set() for num in phone_numbers: # 生成从长度1到完整号码的所有前缀,比如"316938299"会生成"3"、"31"、"316"…… for i in range(1, len(num)+1): valid_prefix_set.add(num[:i]) # 直接过滤前缀DataFrame prefixes_df_filtered = prefixes_df[prefixes_df['prefix'].isin(valid_prefix_set)]
方案2:短路遍历判断法(实现最简单)
利用any的短路特性,只要找到第一个匹配的手机号就停止判断,实现逻辑直白易懂,30万行数据通常1-2秒就能完成处理。
phone_numbers = ['316938299', '82027777', '31223459'] def check_prefix(p): # 判断当前前缀是否是任意手机号的开头 return any(num.startswith(p) for num in phone_numbers) prefixes_df_filtered = prefixes_df[prefixes_df['prefix'].apply(check_prefix)]
方案3:正则匹配法(灵活性最高)
如果你后续需要扩展更复杂的匹配规则,可以用正则方案实现:
import re phone_numbers = ['316938299', '82027777', '31223459'] # 所有手机号拼接为换行分隔的字符串 all_nums = '\n'.join(phone_numbers) def check_prefix(p): # 开启多行匹配,判断是否存在以当前前缀开头的手机号 return bool(re.search(rf'^{re.escape(p)}', all_nums, flags=re.M)) prefixes_df_filtered = prefixes_df[prefixes_df['prefix'].apply(check_prefix)]
内容的提问来源于stack exchange,提问作者Sinceris
相关产品推荐
相关产品推荐

