根据标点符号列表替换数据框中的标点符号[重复]
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
【讨论】:
以上是关于根据标点符号列表替换数据框中的标点符号[重复]的主要内容,如果未能解决你的问题,请参考以下文章