str.contains的可扩展解决方案,包含pandas

时间:2017-12-22 07:47:59

标签: python regex string pandas dataframe

我正在解析包含字符串对象行的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与单词列表一起使用?

1 个答案:

答案 0 :(得分:4)

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

  1. 通过正则表达式OR管道|
  2. 加入单词的内容
  3. 将此传递给str.contains
  4. 使用结果过滤df1
  5. 要索引0 th 列,请不要使用df1[0](因为这可能被视为含糊不清)。最好使用lociloc(见下文)。

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

    注意:如果words是一个系列,这也可以。

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

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