Pandas使用isin进行字符串反向筛选返回错误结果的问题求助
问题原因及解决方法
嘿,我来帮你捋清楚这个问题哈~你现在的代码之所以返回全部域名,核心问题出在isin()方法的使用上。
问题根源
isin()方法是用来判断整个字符串是否完全匹配列表中的某一项的,但你的两个列表:
tld_1里的.de、.cn只是域名的后缀部分,不是完整的域名(比如info.de和.de完全不一样)tld_2里的info、stack只是域名的前缀部分,同样不是完整域名
所以df['Domain'].isin(tld_1)和df['Domain'].isin(tld_2)的结果全是False,取反~之后就全变成True,自然会返回所有域名啦。
正确的筛选方案
根据你的需求(匹配前缀或后缀),我们可以用Pandas的字符串方法来实现:
1. 筛选以指定后缀结尾的域名
用str.endswith()方法,它支持传入一个后缀列表(需要转成元组):
import pandas as pd df = pd.DataFrame({'Domain':['info.de','onfi.ru','kcast.fr','stack.cn']}) tld_1 =['.de', '.cn'] # 筛选以tld_1中任意后缀结尾的域名 filtered_tld = df[df['Domain'].str.endswith(tuple(tld_1))] print(filtered_tld)
运行结果:
Domain 0 info.de 3 stack.cn
2. 筛选以指定前缀开头的域名
用str.startswith()方法,同样支持列表转元组:
tld_2 =['info', 'stack'] # 筛选以tld_2中任意前缀开头的域名 filtered_prefix = df[df['Domain'].str.startswith(tuple(tld_2))] print(filtered_prefix)
运行结果也是你想要的两个域名:
Domain 0 info.de 3 stack.cn
3. 额外:筛选包含指定子串的域名
如果你的需求是域名中任意位置包含这些字符串,还可以用str.contains():
# 用|连接列表中的子串,实现多匹配 filtered_contains = df[df['Domain'].str.contains('|'.join(tld_2))] print(filtered_contains)
内容的提问来源于stack exchange,提问作者user3732793
相关产品推荐
相关产品推荐

