我有一列数据看起来像这样:
df = pd.DataFrame({'Ex1':['apple','apple1','Peear','peAr','b$nana','Bananas'],
'Ex2': ['Applet','banan','apples','PAIR','banana','apple'],
'Ex3':['Pears', 'Banaa', 'Apple', 'apple1', 'pear', 'abanana]}); df
然后我有三个阵列识别水果类型的拼写错误作为规范的水果类型:
apple = ['apple1','Applet','apples','Apple']
pear = ['Peear','peAr','PAIR','Pears','p3ar']
banana = ['b$nana','Bananas','banan','Banaa','abanana']
如何迭代每个列以将拼写错误的水果更改为正确的水果。即最终的数据框应如下所示:
Ex1 Ex2 Ex3
0 apple apple pear
1 apple banana banana
2 pear apple apple
3 pear pear apple
4 banana banana pear
5 banana apple banana
我知道我可以使用以下代码实现此结果:
replacements = {
"apple":'apple1',
"apple":'Applet',
...}
df['Ex1'].replace(replacements, inplace=True)
但我有一个1000多行的列表,我不想通过并在replacements
进行每次更换,因为这将花费很多时间。
有什么建议,我可以使用我的apple
,pear
和banana
变量吗?
涉及手写错误拼写列表的简单(可能甚至是简单化)方法只需通过从列表构建字典即可实现自动化:
repl={s:n for n,l in [("apple",apple),("pear",pear),("banana",banana)]
for s in l}
每个正确的名称和拼写错误列表本身可以自动构建,如果它们驻留在某些数据结构中,如包含字典。 (可以使用globals()
或locals()
作为该词典,但是你必须过滤掉无关的条目。)
更准确的解决方案是计算拼写错误的单词和拼写正确的单词之间的相似性比率。在Python中可用的少数库中,我使用了具有ratio函数的Levenshtein库,该函数返回相似比。要获得比例非常简单,例如:
from Levenshtein import ratio
ratio('banana', 'Banaa')
#0.7272727272727273
现在,如果我们有以下正确单词correct_words
列表,则将在系列中的每个单词和correct_words
之间计算比率。
correct_words = ['apple', 'pear', 'banana']
这意味着每个元素将具有三个比率值。但是,我们只关心最大比率值和与之相关的正确单词。下面的similarity
函数创建了一个中间字典,其中包含比率值和正确的单词(作为键)。该函数返回具有最大值的键。最后,我们将函数返回的键映射到数据帧的每个元素中。
from Levenshtein import ratio
import operator
def similarity(x):
l = {}
for i in correct_words:
l[i] = ratio(x,i)
return max(l.items(), key=operator.itemgetter(1))[0]
df.applymap(similarity)
Ex1 Ex2 Ex3
0 apple apple pear
1 apple banana banana
2 pear apple apple
3 pear apple apple
4 banana banana pear
5 banana apple banana