带有熊猫字符串列表的 str.contains 的可扩展解决方案

Posted

技术标签:

【中文标题】带有熊猫字符串列表的 str.contains 的可扩展解决方案【英文标题】:Scalable solution for str.contains with list of strings in pandas 【发布时间】:2018-06-04 21:11:03 【问题描述】:

我正在解析一个包含字符串对象行的 pandas 数据框 df1。我有一个关键字参考列表,需要删除 df1 中包含参考列表中任何单词的每一行。

目前,我是这样做的:

reference_list: ["words", "to", "remove"]
df1 = df1[~df1[0].str.contains(r"words")]
df1 = df1[~df1[0].str.contains(r"to")]
df1 = df1[~df1[0].str.contains(r"remove")]

这不能扩展到数千个单词。但是,当我这样做时:

df1 = df1[~df1[0].str.contains(reference_word for reference_word in reference_list)]

我产生错误第一个参数必须是字符串或编译模式

按照this的解决方案,我试过了:

reference_list: "words|to|remove" 
df1 = df1[~df1[0].str.contains(reference_list)]

不会引发异常,但不会解析所有单词。

如何有效地使用带有单词列表的 str.contains?

【问题讨论】:

当你说“不可扩展”时,你的意思是你会有一堆重复的代码吗?如果是这样,请使用循环:for reference_word in reference_list: 你试过this问题吗? 我会先加入这些词并将它们传递给str.contains 你能详细说明一下吗:Which doesn't raise an exception but doesn't parse all words eather.?你能提供一个例子来证明它不起作用吗?因为它应该。 @sudonym 如果您正在寻找超过正则表达式的速度,我建议您通过 Flasktext medium.freecodecamp.org/… 获得 10000 倍速度 【参考方案1】:

对于可扩展的解决方案,请执行以下操作 -

    通过正则表达式或管道|加入单词的内容 将此传递给str.contains 使用结果过滤df1

要索引第 0th 列,请不要使用 df1[0](因为这可能会被认为不明确)。最好使用lociloc(见下文)。

words = ["words", "to", "remove"]
mask = df1.iloc[:, 0].str.contains(r'\b(?:)\b'.format('|'.join(words)))
df1 = df1[~mask]

注意:如果words 是一个系列,这也将起作用。


或者,如果您的第 0th 列仅是单词列(不是句子),那么您可以使用 df.isin,这应该会更快 -

df1 = df1[~df1.iloc[:, 0].isin(words)]

【讨论】:

@sudonym 不客气。你用的是 contains 还是 isin? str.contains,因为我在 iloc[:,0] 中有句子 @cᴏʟᴅsᴘᴇᴇᴅ 我们应该尝试使用flashtext 发布答案,这听起来很有希望。 请问,这是什么意思? r'\b(?:)\b' @ahbon 我正在将您的搜索短语插入到捕获组中。我只想匹配完整的单词。

以上是关于带有熊猫字符串列表的 str.contains 的可扩展解决方案的主要内容,如果未能解决你的问题,请参考以下文章

根据 str.contains() 找到的行添加列。熊猫

熊猫数据框 str.contains() AND 操作

在熊猫数据框上使用 str.contains [重复]

按包含 str 过滤熊猫数据帧行

使用str.contains()在加号(+)之后找不到字符串

检查熊猫数据框中是不是有多个子字符串[重复]