根据标点符号列表替换数据框中的标点符号[重复]

Posted

技术标签:

【中文标题】根据标点符号列表替换数据框中的标点符号[重复]【英文标题】:Replacing punctuation in a data frame based on punctuation list [duplicate] 【发布时间】:2014-03-07 12:10:29 【问题描述】:

使用 Canopy 和 Pandas,我的数据框 a 由以下内容定义:

a=pd.read_csv('text.txt')

df=pd.DataFrame(a)

df.columns=["test"]

test.txt 是一个单列文件,其中包含一个包含文本、数字和标点符号的字符串列表。

假设 df 看起来像:


测试

%hgh&12

abc123!!!

炸猪排


我希望我的结果是:


测试

hgh12

abc123

炸猪排


目前的努力:

from string import punctuation /-- import punctuation list from python itself

a=pd.read_csv('text.txt')

df=pd.DataFrame(a)

df.columns=["test"] /-- define the dataframe


for p in list(punctuation):

     ...:     df2=df.med.str.replace(p,'')

     ...:     df2=pd.DataFrame(df2);

     ...:     df2

上面的命令基本上只是用相同的数据集返回给我。 欣赏任何潜在客户。

编辑:我使用 Pandas 的原因是因为数据量很大,跨越大约 100 万行,未来编码的使用将应用于高达 3000 万行的列表。 长话短说,我需要以非常有效的方式清理大数据集的数据。

【问题讨论】:

是所有数据文本还是有数字?例如,如果有人键入 3.14 作为字符串,你真的要去掉句点吗? @philshem 是的,对于这种特殊情况。数据量很大,可能跨越数百万行。这就是为什么我打折那些有标点符号等的原因。想一想,“Paracetemol 50mg 10% Discount”应该只返回给我“Paracetemol”。同样,拼写错误“Actife@4d”应返回“Actife4d”,作为第一级过滤器。 【参考方案1】:

翻译通常被认为是删除标点符号的最干净、最快捷的方法 (source)

import string
text = text.translate(None, string.punctuation.translate(None, '"'))

您可能会发现在将“a”中的标点符号加载到 pandas 之前删除它会更好。

【讨论】:

它返回给我一个 DataFrame 没有“翻译”的错误;属性。抱歉,还需要提到数据量很大,这就是为什么要在 Pandas 上实现。【参考方案2】:

replace 与正确的正则表达式一起使用会更容易:

In [41]:

import pandas as pd
pd.set_option('display.notebook_repr_html', False)
df = pd.DataFrame('text':['test','%hgh&12','abc123!!!','porkyfries'])
df
Out[41]:
         text
0        test
1     %hgh&12
2   abc123!!!
3  porkyfries

[4 rows x 1 columns]

将正则表达式与表示不是字母数字/空格的模式一起使用

In [49]:

df['text'] = df['text'].str.replace('[^\w\s]','')
df
Out[49]:
         text
0        test
1       hgh12
2      abc123
3  porkyfries

[4 rows x 1 columns]

【讨论】:

嗯,有道理。但可能要弄清楚 & 没有被省略的原因。 @user3288092 刚刚阅读文档,strip 删除了开头和结尾的字符,因此出现错误,您应该使用replace unicode 标点符号呢,比如很多类型的破折号? cs.tut.fi/~jkorpela/dashes.html#unidash @user3288092 在弄清楚我认为正确的正则表达式模式应该是什么后,我更新了我的答案,它适用于这个有限的示例数据 @EdChum 嗨,感谢您的回答,我认为这会奏效。但我期待将我不断需要替换的值存储在列表中并每次运行该命令。该列表将作为过滤器继续增长。这种方法必须高效,并且易于更新。【参考方案3】:

用于从数据框中的文本列中删除标点符号:

在:

import re
import string
rem = string.punctuation
pattern = r"[]".format(rem)

pattern

输出:

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

在:

df = pd.DataFrame('text':['book...regh', 'book...', 'boo,', 'book. ', 'ball, ', 'ballnroll"', '"rope"', 'rick % '])
df

输出:

        text
0  book...regh
1      book...
2         boo,
3       book. 
4       ball, 
5   ballnroll"
6       "rope"
7      rick % 

在:

df['text'] = df['text'].str.replace(pattern, '')
df

您可以将模式替换为您想要的字符。前 - 替换(模式,'$')

输出:

        text
0   bookregh
1       book
2        boo
3      book 
4      ball 
5  ballnroll
6       rope
7     rick  

【讨论】:

以上是关于根据标点符号列表替换数据框中的标点符号[重复]的主要内容,如果未能解决你的问题,请参考以下文章

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

删除熊猫中的标点符号[重复]

替换 C++ 字符串中的标点符号

删除熊猫数据框中“标签”列中出现数字后的空格

word中利用宏替换标点标点全角与半角

如何从列表中的项目中删除标点符号并将其另存为列表中的单独项目?