通过pandas.DataFrame更正字符串中的拼写错误

时间:2014-02-12 01:44:12

标签: python dataframe

我有一个列表存储在文本中的大量失真数据列表,我需要做一些争论,但却无法弄清楚什么是最好和最有效的方法。另一个考虑因素是这个数据非常庞大。样本量为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之外的更好的替代方案,我很乐意听取您的意见。

1 个答案:

答案 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”虽然这不应该发生。您的算法非常基本,因此有问题。