从 Pandas DataFrame 列中删除特定符号(unicode)[重复]

Posted

技术标签:

【中文标题】从 Pandas DataFrame 列中删除特定符号(unicode)[重复]【英文标题】:Delete specific symbols (unicode) from Pandas DataFrame Column [duplicate] 【发布时间】:2018-05-29 15:56:53 【问题描述】:

我有 DataFrame(熊猫):

data1 = pandas.DataFrame(['привет, Вася', 'как дела?', 'уиии!!'])

如您所见,它包含 unicode 符号(西里尔文):

>>> data1
              0
0  привет, Вася
1     как дела?
2        уиии!!

我尝试从数据框列中删除所有特定符号。 我试过了:

data1.apply(replace ???)
data1[0].replace()

甚至还有 lambda。 但我不知道如何正确调用replace。所以我想显示所有符号必须按范围删除:

x in '!@#$%^&*()'

if chr(x) not in range(1040,1072) # chr() of cyrillic

【问题讨论】:

您的预期输出是什么?有什么不是西里尔字母的吗? @cᴏʟᴅsᴘᴇᴇᴅ,不,我想要下一个:['привет Вася' , 'как дела' , 'уиии' ] 。删除所有特定符号(如!@#$'")。我想在一些可用的视图中显示它们(例如使用range 对不起?我不明白。 @Mikhail_Sam,您能否定义 specific symbols 或更好地发布您想要的输出? @MaxU 是的,我想在一些可用的视图中定义它们。例如:if ord(x) in range(0-64) or x in range(91-96) 然后删除它们 【参考方案1】:

也许你在寻找替代品,[!@...] 这里等同于(! or @...) 即:

data1[0].str.replace('[!@#$%^&*()]','')

0    привет, Вася
1       как дела?
2            уиии
Name: 0, dtype: object

如果您要替换整个数据框中的标点符号,请选择

 data1.replace('[!@#$%^&*()]','',regex=True)

根据评论,您可能正在寻找的正则表达式

data1.replace('[^\w\s]','',regex=True) 

【讨论】:

很好,但str.replace 一次只能处理一列。我猜你想要replace 我认为数据帧中不可能有数据字符串。 是的,你是对的,我只需要处理几列。你能澄清一下,\w\s 是什么意思吗?首先是你的方法 - 如果我也想删除 [] 符号怎么办? 使用转义字符,如\[^ 不使用,\w 仅用于字母和数字,所有特殊字符将被忽略,\s 用于空格。我删除了除 \w\s 以外的所有内容 感谢您的澄清!还有一个问题,如果你让:如何删除数字 0-9?【参考方案2】:

好的,IIUC,使用string.punctuation 并使用replace 执行替换 -

import string
data1.replace(r'[]'.format(string.punctuation), '', regex=True)

             0
0  привет Вася
1     как дела
2         уиии 

在哪里,

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

如果您想排除特定字符/字符集,这是一种方法,使用 set.difference -

c = set(string.punctuation)
p_to_exclude = ['?', ...]

c = c.difference(p_to_exclude)

现在,您可以像以前一样使用c -

data1.replace(r'[]'.format(re.escape(''.join(c))), '', regex=True)
             0
0  привет Вася
1    как дела?
2         уиии

这里的另一件事是使用re.escape,因为[] 被认为是元字符,需要转义。

【讨论】:

太棒了!那么我可以使用data1[0].replace 来替换一列吗?您能否澄清一下您的答案。 r'' 是什么意思?还有一个细节 - 例如,如果我想删除所有标点符号 exept ? 怎么办? @Mikhail_Sam “r” 是原始字符串。如果要对一列执行替换,可以使用 iloc 或 [..] 和调用 replace 或 str.replace 对其进行索引。另外,如果要排除特定字符,可以在标点字符串上使用 str.replace。 使用原始字符串被认为是一种很好的做法,尤其是使用正则表达式。 @Mikhail_Sam 好的,看看我的编辑。 谢谢你这么详细的回答!【参考方案3】:

你可以使用 unicode RegEx (?u):

来源 DF:

In [30]: df
Out[30]:
                        col
0              привет, Вася
1                 как дела?
2              уиии 23 45!!
3  давай Вася, до свидания!

解决方案(删除所有数字、所有尾随空格和所有非字符,除了空格和问号):

In [36]: df.replace(['\d+', r'(?u)[^\w\s\?]+', '\s*$'], ['','',''], regex=True)
Out[36]:
                      col
0             привет Вася
1               как дела?
2                    уиии
3  давай Вася до свидания

RegEx explained ...

【讨论】:

Velikolepno!您能否澄清一下,(?u)\w\s 是什么意思?以及如何删除所有特定符号 exept ? (?u) 对我来说是新的 最后一个问题:如何也删除数字0-9? @Mikhail_Sam,我已经扩展了我的答案 - 请检查... @Mikhail_Sam,不客气! :)

以上是关于从 Pandas DataFrame 列中删除特定符号(unicode)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

从 Pandas Dataframe Column 中删除重复的逗号,换句话说,我只需要列中的文本,用逗号分隔它们

pandas DataFrame 列中的布尔运算

pandas使用replace函数将dataframe指定数据列中的特定字符串进行自定义替换(replace substring in dataframe column values)

从 pandas DataFrame 中删除名称包含特定字符串的列

从 Pandas 数据框列中删除“秒”和“分钟”

删除 pandas DataFrame 列中字符串条目的结尾