从Pandas DataFrame列中删除特定符号(unicode)

时间:2017-12-15 12:22:38

标签: python string pandas dataframe char

我有DataFrame(pandas):

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

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

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

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

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

甚至是lambda的东西。 但我不知道如何正确地呼叫replace。因此,我想显示所有符号必须按范围删除:

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

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

3 个答案:

答案 0 :(得分:4)

您可以使用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 ...

答案 1 :(得分:3)

好的,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,因为[]被视为元字符,需要进行转义。

答案 2 :(得分:2)

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

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

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

如果您要在整个数据框中替换puntuations,请转到

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

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

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