【问题标题】:How to use str.contains() with multiple expressions, in pandas dataframes?如何在熊猫数据框中使用带有多个表达式的 str.contains()?
【发布时间】:2026-01-25 12:35:01
【问题描述】:

我想知道是否有更有效的方法来使用 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'

有没有快速的方法来做到这一点?感谢您的帮助,我是初学者,但我很喜欢 pandas 来处理数据。

【问题讨论】:

  • 注意:有一个解决方案described by @unutbu,比使用pd.Series.str.contains效率更高。如果性能是一个问题,那么这可能值得调查。
  • 强烈建议查看this answer,了解有关使用多个关键字/正则表达式进行部分字符串搜索的更多信息。
  • 这是一个简单的错字,你只需要 ..str.contains("nt|nv") 。 '|' bar 进入正则表达式内部,而不是两个字符串之间。

标签: python string performance pandas dataframe


【解决方案1】:

它们应该是一个正则表达式,并且应该在一个字符串中:

"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'

【讨论】:

  • 谢谢这么美!但请注意,管道和搜索词之间不能有空格!
  • @jaknap32: 如果你使用 (?x) 修饰符,你可以在任何你想要的地方添加空格 - "(?x)nt | nv" - (但如果你在模式中有有意义的空格,你需要将它们转义,因为以及# char)。见Python re.X docs。无论如何,n[tv] 是比nt|nv 更好的正则表达式。
  • +1 表示“na=False”表达式。我的数据中有空白,我的字符串包含函数没有它就无法工作。
【解决方案2】:

我试试这个,它的工作:

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

【讨论】: