从 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使用replace函数将dataframe指定数据列中的特定字符串进行自定义替换(replace substring in dataframe column values)