Pandas多条件筛选时isin与str.contains结果差异原因咨询
isin与str.contains的差异及结果不一致原因
两个方法的核心匹配逻辑区别
isin是完全精确匹配:只有当countryname列的单元格完整值,和你传入的countries列表中某一个元素完全相等时,才会返回True,字符、大小写、空格有任何差异都不会匹配成功。str.contains是子串模糊匹配:只要countryname列的单元格字符串中包含你传入的关键字,无论关键字前后是否存在其他内容,都会返回True。
本次场景下结果不一致的具体原因
你数据集里的countryname字段存储的大概率是完整国名,比如Bosnia and Herzegovina、Republic of Croatia这类格式,而非countries列表里的简短单值Bosnia、Croatia:
- 使用
isin时,只有国名刚好和列表里的短名称完全一致的记录能被匹配到,所以只返回了2条结果。 - 使用
str.contains时,只要完整国名里包含你输入的关键字就能匹配成功,同时你还额外加入了countries列表中没有的Montenegro匹配规则,覆盖了更多符合要求的记录,所以最终返回了预期的12条结果。
如果要优化模糊匹配的写法,不需要写多个或条件,可以直接用正则合并匹配规则:
# 等价于多个str.contains或条件的简化写法 target_countries = 'Bosnia|Croatia|Kosovo|Macedonia|Montenegro|Serbia|Slovenia' projects[ (projects['boardapprovaldate'] < pd.Timestamp(datetime.date(1992,4,27))) & (projects['countryname'].str.contains(target_countries, na=False)) ][cols_to_keep.columns].sort_values('boardapprovaldate')
内容的提问来源于stack exchange,提问作者Juma Hamdan
相关产品推荐
相关产品推荐

