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?
对于可扩展的解决方案,请执行以下操作-
|str.containsdf1索引0 次列,不使用df1[0](因为这可能被认为不明确)。最好使用loc或iloc(请参见下文)。
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)