如何使用df.column.str.contains()实现与给定自定义筛选函数相同的效果
问题原因
你写的正则表达式确实是导致结果不一致的核心原因,问题出在你给关键词前后加的(\w|\W)匹配规则:
(\w|\W)等价于匹配任意1个字符,这套规则强制要求「England」「King」两个关键词的前后必须至少存在1个其他字符- 这会漏掉三种符合要求的场景:
- 关键词出现在
question字段的开头(比如字段值为England's King is Charles,开头的England前面没有字符,无法被你的正则匹配) - 关键词出现在
question字段的结尾(比如字段值为Who is the King of England,结尾的England后面没有字符,无法被你的正则匹配) - 字段值仅由关键词组成(比如字段值为
England King,两个关键词都不会被你的正则匹配)
- 关键词出现在
而参考代码的逻辑是只要关键词作为子串存在就匹配,没有位置限制,所以两者结果不一致。
正确实现方案
方案1:关闭正则,直接匹配子串(更简洁高效,推荐)
不需要用正则,str.contains关闭正则时就是直接判断子串是否存在,和参考代码逻辑完全一致:
re_filter = data[ (data.question.str.contains("England", case=False, regex=False)) & (data.question.str.contains("King", case=False, regex=False)) ]
方案2:使用正则,去掉多余的前后匹配规则
如果一定要用正则,直接写关键词本身即可,str.contains的正则匹配默认只要子串匹配就返回True:
re_filter = data[ (data.question.str.contains("England", case=False, regex=True)) & (data.question.str.contains("King", case=False, regex=True)) ]
内容的提问来源于stack exchange,提问作者Neednewbrain
相关产品推荐
相关产品推荐

