我有一个列表存储在文本中的大量失真数据列表,我需要做一些争论,但却无法弄清楚什么是最好和最有效的方法。另一个考虑因素是这个数据非常庞大。样本量为160万行,产量可达数百万。
In [200]:data=['Bernard 51','Ber%nard Bachelor','BER78NARD$ bsc','BERnard$d B.']
In [201]:test=pd.DataFrame(data,columns=['Names'])
In [2020:test
Out[202]:
Names
0 Bernard 51
1 Ber%nard Bachelor
2 BER78NARD$ bsc
3 BERnard$d B.
我的目标是输出
Names
0 bernard
1 bernard ba
2 bernard ba
3 bernard ba
我的伪代码将类似于:
In[222]:test_processed=pd.DataFrame(test.Names.str.lower()) #covert all str to lower
In[223]:test_processed
Out[223]:
Names
0 bernard 51
1 ber%nard bachelor
2 ber78nard$ bsc
3 bernard$d b.
In[224]:test_processed2=pd.DataFrame(test_processed.Names.str.replace('[^\w\s]',''))
#removes punctuation/symbol typos
In[225]:test_processed2
Out[225]:
Names
0 bernard 51
1 bernard bachelor
2 ber78nard bsc
3 bernardd b
In[226]:BA=['bachelor','bsc','b.'] #define list to be replaced with ba
In[227]:test_processed.replace(BA,'ba') #replace list defined above with standard term
Out[227]:
Names
0 bernard 51
1 ber%nard bachelor
2 ber78nard$ bsc
3 bernard$d b.
#no change, didn't work
我的观察告诉我,如果列表应用于Pandas DataFrame,则替换不适用于列表。
我没有使用test_processed2.Names.str.replace的原因是因为,DataFrame.str.replace不允许使用列表替换。
我使用列表的原因是因为我希望能够轻松维护列表,因为可能会出现越来越多的不同变量。如果您有解决方案或者除了使用Python或Pandas之外的更好的替代方案,我很乐意听取您的意见。
答案 0 :(得分:1)
test_processed.replace(BA,'ba')
只会替换完全匹配,而不会替换条目的一部分。也就是说,如果你的一个参赛作品是“单身汉”,它就会取而代之。对于部分字符串,您可以按docs使用regex
选项。
还有replace
可用于字符串。因此,例如,如果您有一个列表data
并且您想要将'bsc'的所有实例替换为'ba',那么您要做的是:
data = [d.replace('bsc', 'ba') for d in data]
对于您可以执行的整个替换列表:
data = [d.replace(b, 'ba') for d in data for b in BA]
现在,虽然我觉得这正是你所询问的,但我应该提到这最终不是解决错别字的正确方法。想象一下你有条目“B.Bernard,msc” - 你将取代“B”。与“BA”虽然这不应该发生。您的算法非常基本,因此有问题。