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

如何快速在Pandas DataFrame中删除DNS白名单域名对应的行?

高效筛选Pandas DataFrame中排除白名单后缀的行

这绝对是Pandas新手常踩的性能大坑——用iterrows()逐行遍历百万级数据,还在循环里反复调用drop(),这种操作的效率简直低到离谱!咱们来拆解问题,再给你两个快到飞起的解决方案:

为什么你的方法这么慢?

  1. iterrows()是行级Python循环:Pandas的核心优势是矢量化操作(底层用C实现),而iterrows()会把每一行转成Python对象逐行处理,速度比矢量化操作慢几十甚至上百倍。
  2. 频繁drop()触发重复索引重排:每次调用drop(idx, inplace=True)都会修改整个DataFrame,重新构建索引,百万级数据下这种操作的开销是指数级增长的,耗时自然远超1小时。

高效解决方案(两种任选)

方案1:用矢量化的str.endswith()(推荐,最快)

Pandas的str.endswith()原生支持传入元组批量匹配后缀,结合取反操作就能一次性筛选出需要保留的行:

# 把白名单改成元组(str.endswith支持元组批量匹配)
whitelist = ('-', '(empty)', 'in-addr.arpa', '.google.com', '.akamai.net', '.akamaiedge.net', '.apple.com', '.contoso.msft')

# 生成布尔掩码:标记出query不匹配任何白名单后缀的行
mask = ~bro_df['query'].str.endswith(whitelist)

# 直接筛选得到新DataFrame(避免原地修改,更高效)
filtered_df = bro_df[mask].copy()

这个方法的时间复杂度是O(n)(n是行数),百万级数据几秒就能处理完,内存占用也和原数据相当(因为是批量操作)。

方案2:正则表达式匹配(适合更复杂的规则)

如果你的白名单里有需要转义的特殊字符,或者匹配规则不止是后缀,可以用正则表达式批量匹配:

import re

# 构建正则模式:匹配任何以白名单元素结尾的字符串,自动转义特殊字符
pattern = '|'.join([re.escape(item) + '$' for item in whitelist])

# 生成掩码:排除匹配到的行
mask = ~bro_df['query'].str.contains(pattern, regex=True)

filtered_df = bro_df[mask].copy()

额外优化建议

  • 尽量避免inplace=True:原地修改DataFrame有时候会触发额外的内存拷贝和索引重排,生成新的DataFrame反而更稳定高效。
  • 提前清理不必要的列:你已经做了这一步,非常好!更少的列意味着更少的内存占用和更快的处理速度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:59:17