从数据框中删除所有标点符号,除了一些字符[重复]

Posted

技术标签:

【中文标题】从数据框中删除所有标点符号,除了一些字符[重复]【英文标题】:Remove all the punctuation from a dataframe, except some characters [duplicate] 【发布时间】:2019-04-10 23:29:47 【问题描述】:

我正在尝试从数据框中删除所有标点符号,除了字符“”

我试过了:

def non_punct(df):

    df['C'] = df['C'].str.replace('[^\w\s]' | ~(<) | ~(>),' ')

    return df

输出:

    File "<ipython-input-292-ac8369672f62>", line 3
        df['Description'] = df['Description'].str.replace('[^\w\s]' | ~(<) | ~(>),' ')
                                                                ^
SyntaxError: invalid syntax

我的数据框:

       A          B                                    C
  French      house               Phone. <phone_numbers>
 English      house               email - <adresse_mail>
  French  apartment                      my name is Liam
  French      house                        Hello George!
 English  apartment   Ethan, my phone is <phone_numbers>

良好的输出:

       A          B                                    C
  French      house               Phone <phone_numbers>
 English      house               email  <adresse_mail>
  French  apartment                     my name is Liam
  French      house                        Hello George 
 English  apartment   Ethan my phone is <phone_numbers>

【问题讨论】:

您能否添加所需的输出,因为您的正则表达式中似乎缺少引号? @zipa 完成!谢谢 【参考方案1】:

这是使用re.sub 实现结果的一种方法。另外,我认为您的正则表达式已关闭,应该是[[^\w\s^&lt;^&gt;]|_。这匹配不是数字、整数、空格、 的所有内容。您必须明确匹配下划线,因为 \w 中免除了它。

import re
re.sub('[^\w\s^<^>]|_', ' ', 'asdf.,:;/\><a b_?!"§$%&a')
>>> 'asdf      ><a b        a'

作为比较:

re.sub('[^\w\s] | ~(<) | ~(>)', ' ', 'asdf.,:;/\><a b_?!"§$%&a')
>>> 'asdf.,:;/\\><a b_?!"§$%&a'

re.sub('[^\w\s^<^>]', ' ', 'asdf.,:;/\><a b_?!"§$%&a')
>>> 'asdf      ><a b_       a'

编辑:您的错误是由放错引号引起的:它应该是 '[^\w\s] | ~(&lt;) | ~(&gt;)' 而不是 '[^\w\s]' | ~(&lt;) | ~(&gt;)

编辑 2:正如@Brad Solomon 所指出的,pd.Series.str.replace 与正则表达式完美匹配,因此在您的语句中添加 [[^\w\s^&lt;^&gt;]|_ 作为匹配的模式应该可以解决问题。不过,还没有测试过。 @marin:如果您碰巧尝试一下,请给我反馈,以便我在需要时更新帖子。

【讨论】:

你是对的!感谢您指出我的错误。我应该学会正确阅读。将编辑我的帖子以不再说明【参考方案2】:

在单行中(除了import)它将是:

import string
df['C'] = df['C'].str.translate(None, string.translate(string.punctuation, None, '<>'))

【讨论】:

【参考方案3】:

这是string.punctuation的一种方式:

>>> import re
>>> import string

>>> import pandas as pd

>>> df = pd.DataFrame(
...     'a': ['abc', 'de.$&$*f(@)<', '<g>hij<k>'],
...     'b': [1234, 5678, 91011],
...     'c': ['me <me@gmail.com>', '123 West-End Lane', '<<xyz>>']
... )

>>> punc = string.punctuation.replace('<', '').replace('>', '')

>>> pat = re.compile(f'[punc]')
>>> df.replace(pat, '')
           a      b                 c
0        abc   1234   me <megmailcom>
1       def<   5678  123 WestEnd Lane
2  <g>hij<k>  91011           <<xyz>>

您应该仔细检查此常量是否包含您想要的内容:

被视为标点字符的 ASCII 字符串 在 C 语言环境中。

价值观:

>>> string.punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`|~'
>>> string.punctuation.replace('<', '').replace('>', '')
'!"#$%&\'()*+,-./:;=?@[\\]^_`|~'

注意事项:

此解决方案使用f-string (Python 3.6+) 它将这些文字字符括在 character set 中以匹配其中任何一个 注意df.replace()df[my_column_name].str.replace() 之间的区别。 pd.DataFrame.replace() 的签名是 DataFrame.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad'),其中 to_replace 可以是正则表达式。

【讨论】:

以上是关于从数据框中删除所有标点符号,除了一些字符[重复]的主要内容,如果未能解决你的问题,请参考以下文章

删除熊猫数据框中每一行的标点符号[重复]

从整个 Python Pandas 数据框中删除美元符号

从数据框中删除行的命令[重复]

如何根据条件表达式从熊猫数据框中删除行[重复]

如何根据条件表达式从熊猫数据框中删除行[重复]

如何删除所有重复项以使 NONE 留在数据框中?