从数据框中删除所有标点符号,除了一些字符[重复]
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^<^>]|_
。这匹配不是数字、整数、空格、 的所有内容。您必须明确匹配下划线,因为 \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] | ~(<) | ~(>)'
而不是 '[^\w\s]' | ~(<) | ~(>)
编辑 2:正如@Brad Solomon 所指出的,pd.Series.str.replace
与正则表达式完美匹配,因此在您的语句中添加 [[^\w\s^<^>]|_
作为匹配的模式应该可以解决问题。不过,还没有测试过。 @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
可以是正则表达式。
【讨论】:
以上是关于从数据框中删除所有标点符号,除了一些字符[重复]的主要内容,如果未能解决你的问题,请参考以下文章