带有熊猫字符串列表的 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]
(因为这可能会被认为不明确)。最好使用loc
或iloc
(见下文)。
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 的可扩展解决方案的主要内容,如果未能解决你的问题,请参考以下文章