You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 10:39:04