【问题标题】:Is there a way in python/pandas to remove a particular set of characters from a stringpython/pandas 中有没有办法从字符串中删除一组特定的字符
【发布时间】:2018-03-07 19:02:40
【问题描述】:

有没有办法一次性从 python 字符串中删除一组特定的字符?

str='23.889,45 €'

我想删除点 '.'和'€'符号,但我不想像str.replace('€','').replace('.',''), whereby replacing the characters with white space那样使用replace()函数两次。

在 SAS 中有一个函数compress,它接受要删除的字符列表,并且在应用该函数时,SAS 字符串中的所有字符都将被删除。例如:compress(str,'.€') 将返回 str as 23889,45

Python中也有对应的函数吗?

【问题讨论】:

  • 使用正则表达式:df['col'].str.replace(r'€|\.',"", regex=True, inplace=True)
  • 您确实意识到您正在谈论的compress 函数以相同的方式处理它??
  • @mrid 是的,确实如此。我只是再次检查以确保这一点。 compress(str,'.€') 确实会删除点和欧元符号的所有实例,我们最终将获得的字符串将失去这些上述字符。
  • @Wiktor Stribiżew 您的代码运行良好。非常感谢。但是,我仍然很难理解语法。另外,请将此代码放在答案中,以便其他人可以从中受益。非常感谢。
  • @WiktorStribiżew 有没有办法也可以指定替换?我的意思是在这种情况下 被替换为$,.?因此,总共从 '23.889,45 €' 我们得到 '23889.45 $'

标签: python string pandas replace


【解决方案1】:

你说的压缩函数一定是这样的:

str='23.889,45 €'

charsToRemove = ["$", ".", "€"]

def compress(str, charsToRemove):
    for i in range(len(charsToRemove)):
        str = str.replace(charsToRemove[i], '')
    return str

print compress(str, charsToRemove) # returns '23889,45 '

【讨论】:

  • 是的,你是对的。这就是 compress 的运作方式。但发布这个问题背后的实际想法是找到一个函数,我可以避免在 for 循环中或并排使用多个 replace 函数。
  • 我要求一个专门处理这种事情的函数的原因是因为编写的专用 python 函数将用低级语言编写 C 并且这样做会比做同样的事情快得多使用多个替换函数。
  • 问题解决了。我要感谢你的努力。非常感谢。问候!
【解决方案2】:

去除多个字符

您可以使用正则表达式来执行多个字符替换。

您感兴趣的构造可以是character classgroupingalternation

字符类是[...],其中包含字符、字符范围或速记字符类,而交替组是(...|....|.....) 类似的模式。在这两种结构中使用文字字符可能会出现问题,但re.escape 来拯救:它会确保您传递给正则表达式的字符被视为文字字符。

查看 Python 3 演示:

>>> import re
>>> charsToRemove = ["$", ".", "€"]
>>> s='23.889,45 €'
>>> print(re.sub("|".join([re.escape(x) for x in charsToRemove]), "", s)) # Alternation group
23889,45 
>>> print(re.sub(r"[{}]+".format("".join([re.escape(x) for x in charsToRemove])), "", s)) # Character class
23889,45 

在 Pandas 中,你会使用

df['col'].str.replace(r"[{}]+".format("".join([re.escape(x) for x in charsToRemove])),"", regex=True, inplace=True)

请注意,字符类方法 ([...]+) 会更快工作。

多次替换

您可以考虑创建一个替换字典,然后将其与 Pandas replace 一起使用:

>>> from pandas import DataFrame
>>> import pandas as pd
>>> import regex
>>> repl_list = {'€':'$', ',':'.', r'\.': ''}
>>> col_list = ['23.889,45 €']
>>> frame = pd.DataFrame(col_list, columns=['col'])
>>> frame['col'].replace(repl_list, regex=True, inplace=True)
>>> frame['col']
0    23889.45 $

要使其工作,您必须使用regex=True 参数并添加import re,因为repl_list 中的所有键都是正则表达式。不要忘记在那里转义特殊的正则表达式字符。请参阅What special characters must be escaped in regular expressions? 或者,您可以将r'\.' 写为re.escape('.')

【讨论】:

  • 非常感谢您的时间和努力。我真的被这个问题震惊了。您提供的链接非常有用,我想人们可以很好地理解正则表达式。我在这里测试了它们regex。我注意到,如果您更改 repl_list 中第二个和第三个元素的顺序,那么结果可能会有所不同。因此,这意味着替换是按顺序进行的。它完全解决了我的问题。非常感谢 Wiktor 的支持。
  • @OliverS 很高兴它成功了。我认为您可以删除其中一个受骗的 cmets :)
猜你喜欢
  • 2016-01-02
  • 1970-01-01
  • 2014-06-02
  • 2022-01-22
  • 1970-01-01
  • 2023-03-07
  • 2011-04-25
  • 2016-09-19
  • 1970-01-01
相关资源
最近更新 更多