我有一个巨大的扭曲数据列表,存储在文本中,我需要做一些争论,但无法弄清楚什么是最好和最有效的方法。另一个考虑因素是该数据非常庞大。样本大小为 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 更好的替代方案,我很乐意听取您的意见.
请您参考如下方法:
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”虽然这不应该发生。您的算法非常基础,因此有问题。
