pandas中str.contains('|')筛选DataFrame行失效问题求助
问题原因
pandas的Series.str.contains方法默认使用正则表达式规则做匹配,|是正则中表示「或」逻辑的特殊元字符。直接传入'|'作为匹配参数时,实际匹配规则等价于「匹配空字符串 或 匹配空字符串」,所有字符串都能命中该规则,因此会返回全部行,表现为筛选失效。传入普通字符(如'a')时不存在特殊语义冲突,因此可以正常工作。
解决方案
任选以下一种方式修改即可:
- 对特殊字符做正则转义:在
|前加反斜杠转义,告诉正则引擎要匹配的是字面意义的竖线字符 - 关闭正则匹配模式:传入
regex=False参数,让方法直接按普通字符串做子串匹配,无需处理任何正则特殊字符
示例代码
初始测试数据:
import pandas as pd df = pd.DataFrame({'A':['aaa', 'bbb | aaa', 'ccc'], 'B':['abababa', 'a | b', 'abab | abab']}) colA = 'A'
筛选A列包含|的行:
# 写法1:正则转义 display(df.loc[df[colA].str.contains(r'\|')]) # 写法2:关闭正则(推荐,无需记忆正则特殊字符) display(df.loc[df[colA].str.contains('|', regex=False)])
两种写法返回结果一致,仅保留A列含竖线的行:
| 索引 | A | B |
|---|---|---|
| 1 | bbb | aaa |
如果需要删除包含|的行,在条件前加取反运算符~即可:
df_clean = df.loc[~df[colA].str.contains('|', regex=False)]
返回结果:
| 索引 | A | B |
|---|---|---|
| 0 | aaa | abababa |
| 2 | ccc | abab |
注意:除
|外,. * + ? ^ $ ( ) [ ] { } \均为正则特殊字符,在str.contains默认开启正则的模式下直接传入这些字符做匹配,都会出现类似的匹配不符合预期的问题,匹配普通字符串时建议统一加regex=False避免踩坑。
内容的提问来源于stack exchange,提问作者Anya Konkina
相关产品推荐
相关产品推荐

