对于str.contains扩展的解决方案,在大熊猫的字符串列表

sud*_*nym 3 python regex string dataframe pandas

我正在解析df1包含字符串对象行的pandas数据框。我有一个关键字参考列表,需要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")]
Run Code Online (Sandbox Code Playgroud)

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

df1 = df1[~df1[0].str.contains(reference_word for reference_word in reference_list)]
Run Code Online (Sandbox Code Playgroud)

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

按照解决方案,我尝试了:

reference_list: "words|to|remove" 
df1 = df1[~df1[0].str.contains(reference_list)]
Run Code Online (Sandbox Code Playgroud)

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

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

cs9*_*s95 6

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

  1. 通过正则表达式或管道连接单词的内容 |
  2. 传递给 str.contains
  3. 使用结果进行过滤 df1

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

words = ["words", "to", "remove"]
mask = df1.iloc[:, 0].str.contains(r'\b(?:{})\b'.format('|'.join(words)))
df1 = df1[~mask]
Run Code Online (Sandbox Code Playgroud)

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


另外,如果您的 0 列仅是单词(而不是句子)的列,则可以使用df.isin,这应该更快-

df1 = df1[~df1.iloc[:, 0].isin(words)]
Run Code Online (Sandbox Code Playgroud)