如何在pandas数据框中使用str.contains()函数来匹配多个表达式

42

我想知道在Pandas中是否有更有效的方法来使用str.contains()函数,以一次搜索两个部分字符串。我想要在数据帧的给定列中搜索包含“nt”或“nv”的数据。目前,我的代码看起来是这样的:

df[df['Behavior'].str.contains("nt", na=False)]
df[df['Behavior'].str.contains("nv", na=False)]

然后我将一个结果附加到另一个结果。我想做的是使用一行代码搜索包含“nt”或“nv”或“nf。”的任何数据。我尝试了一些我认为应该能工作的方式,包括在术语之间添加管道符,但所有这些都导致错误。我已经检查了文档,但我没有看到这个选项。我收到以下错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-113-1d11e906812c> in <module>()
3 
4 
----> 5 soctol = f_recs[f_recs['Behavior'].str.contains("nt"|"nv", na=False)]
6 soctol

TypeError: unsupported operand type(s) for |: 'str' and 'str'

有没有快速的方法来做这件事?


请注意:有一种解决方案由@unutbu描述,比使用pd.Series.str.contains更高效。如果性能是问题,那么这可能值得探究。 - jpp
强烈推荐查看此答案,以获取有关使用多个关键字/正则表达式进行部分字符串搜索的更多信息。 - cs95
3个回答

76
他们应该是一个正则表达式,并且应该在一个字符串中:
"nt|nv"  # rather than "nt" | " nv"
f_recs[f_recs['Behavior'].str.contains("nt|nv", na=False)]

Python不允许在字符串上使用或 ( | ) 运算符:

In [1]: "nt" | "nv"
TypeError: unsupported operand type(s) for |: 'str' and 'str'

0
如果您有一个模式列表,那么将它们用管道符号(|)连接起来并传递给str.contains可能会很方便。通过na=False返回NaN的False,并通过case=False关闭大小写敏感性。
lst = ['nt', 'nv', 'nf']
df['Behavior'].str.contains('|'.join(lst), na=False)

否则,将替代方案分组可能更加清晰。对于原帖中的示例,即:
df['Behavior'].str.contains(r'n[t|v|f]')

-2

我试过这个,它可以工作:

df[df['Behavior'].str.contains('nt|nv', na=False)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接