如何使用 Pandas 从给定字符串中删除子字符串

Posted

技术标签:

【中文标题】如何使用 Pandas 从给定字符串中删除子字符串【英文标题】:How can I remove a substring from a given String using Pandas 【发布时间】:2021-03-12 19:53:39 【问题描述】:

最近开始分析一个数据框,想去掉所有不包含的子串

('Aparelho Celular','Internet (Serviços e Produtos)','Serviços Telefônicos Diversos','Telefonia Celular','Telefonia Comunitária ( PABX, DDR, Etc. )','Telefonia Fixa','TV por Assinatura','Televisão / Aparelho DVD / Filmadora','Telemarketing')

但是当我使用这种语法时-

df = df[~df["GrupoAssunto"].str.contains('Aparelho Celular','Internet (Serviços e Produtos)','Serviços Telefônicos Diversos','Telefonia Celular','Telefonia Comunitária ( PABX, DDR, Etc. )','Telefonia Fixa','TV por Assinatura','Televisão / Aparelho DVD / Filmadora','Telemarketing')]

我收到此错误:

TypeError: contains() takes from 2 to 6 positional arguments but 10 were given

【问题讨论】:

您能否提供一个数据框示例和预期输出? 这能回答你的问题吗? How to test if a string contains one of the substrings in a list, in pandas? 请更新问题以阐明用例,以及数据集样本和预期输出。 【参考方案1】:

请改用.isin() 函数。

例如:

vals1 = ['good val1', 'good val2', 'good val3', 'Aparelho Celular','Internet (Serviços e Produtos)','Serviços Telefônicos Diversos','Telefonia Celular','Telefonia Comunitária ( PABX, DDR, Etc. )','Telefonia Fixa','TV por Assinatura','Televisão / Aparelho DVD / Filmadora','Telemarketing']
vals2 = ['Aparelho Celular','Internet (Serviços e Produtos)','Serviços Telefônicos Diversos','Telefonia Celular','Telefonia Comunitária ( PABX, DDR, Etc. )','Telefonia Fixa','TV por Assinatura','Televisão / Aparelho DVD / Filmadora','Telemarketing']

df = pd.DataFrame('col1': vals1)

使用取反的.isin() 函数将提供DataFrame 的视图,不包括vals2 列表中的值。:

df[~df['col1'].isin(vals2)]

输出:

        col1
0  good val1
1  good val2
2  good val3

【讨论】:

这完成了其他事情。 isin() 不适用于子字符串,其方式与 str.contains 相同。 OP 的问题似乎只是基于语法 @noah - 好的,很公平。 OP 需要将问题更新为更明确,并提供一个用例。 (相应评论。)【参考方案2】:

只需在打开正则表达式的情况下用| 分隔不同的单词。这是使用包含搜索多个字符串的正确语法。 re 安全转换处理转义括号和任何其他特殊字符。

bad_strings = ['Aparelho Celular','Internet (Serviços e Produtos)','Serviços Telefônicos Diversos','Telefonia Celular','Telefonia Comunitária ( PABX, DDR, Etc. )','Telefonia Fixa','TV por Assinatura','Televisão / Aparelho DVD / Filmadora','Telemarketing']
safe_bad_strings = [re.escape(s) for s in bad_strings]
df = df[~df["GrupoAssunto"].str.contains('|'.join(safe_bad_strings), regex=True]

您的错误正在发生,因为这 10 个字符串都作为参数传递给 contains。但是 contains 不会期望多个模式,因此它会引发错误。

【讨论】:

以上是关于如何使用 Pandas 从给定字符串中删除子字符串的主要内容,如果未能解决你的问题,请参考以下文章

Python Pandas 使用另一列删除子字符串

pyspark:删除作为另一列值的子字符串,并从给定列的值中包含正则表达式字符

从字符串中删除多个子字符串 - Java

Hive - 从字符串中删除子字符串

如何从列类型列表中删除 pandas DataFrame 中的空值

Pandas 按子字符串或正则表达式分组