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

Python:如何筛选DataFrame列中不在指定号码列表内的数据?

列表与DataFrame列的号码交叉校验方案

高效无循环实现(推荐)

先确保两个核心前提:

  1. 清理allowed_numbers列表,过滤可能产生的空字符串:
    allowed_numbers = [num for num in allowed_numbers if num]
    
  2. 将DataFrame的B-NUMBER列转为字符串类型(避免数值与字符串匹配失效):
    df['B-NUMBER'] = df['B-NUMBER'].astype(str)
    

直接用isin()配合取反符号~筛选不在白名单的号码:

# 提取所有不在allowed_numbers中的B-NUMBER记录
fraud = df[~df['B-NUMBER'].isin(allowed_numbers)]['B-NUMBER']

# 若需要去重后的号码列表,追加以下代码:
fraud = fraud.unique().tolist()

你之前代码的问题说明

  • 第一段代码df[df['B-NUMBER'].isin(allowed_number)]是筛选在白名单内的记录,而非目标的"不在白名单",需加~取反。
  • 第二段代码语法逻辑错误:直接将Series与列表用in比较不生效,且列表推导式的条件逻辑完全颠倒。
  • 第三段代码的apply逻辑错误:它是把单个号码中不属于白名单的字符拼接,完全偏离了"判断整个号码是否在白名单"的需求。

循环实现方案(仅作参考)

如果需要循环实现,建议先把allowed_numbers转成集合(集合的查找效率远高于列表):

allowed_set = set(allowed_numbers)
fraud = []

# 遍历列中每个号码
for num in df['B-NUMBER'].astype(str):
    if num not in allowed_set:
        fraud.append(num)

# 可选:对结果去重
fraud = list(set(fraud))

内容的提问来源于stack exchange,提问作者Monsson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:50:46