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

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列含竖线的行:

索引AB
1bbbaaa

如果需要删除包含|的行,在条件前加取反运算符~即可:

df_clean = df.loc[~df[colA].str.contains('|', regex=False)]

返回结果:

索引AB
0aaaabababa
2cccabab

注意:除|外,. * + ? ^ $ ( ) [ ] { } \均为正则特殊字符,在str.contains默认开启正则的模式下直接传入这些字符做匹配,都会出现类似的匹配不符合预期的问题,匹配普通字符串时建议统一加regex=False避免踩坑。

内容的提问来源于stack exchange,提问作者Anya Konkina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:24:12