Python:如何筛选DataFrame列中不在指定号码列表内的数据?
列表与DataFrame列的号码交叉校验方案
高效无循环实现(推荐)
先确保两个核心前提:
- 清理
allowed_numbers列表,过滤可能产生的空字符串:allowed_numbers = [num for num in allowed_numbers if num] - 将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
相关产品推荐
相关产品推荐

