如何从可能的字符串列表中替换python中的字符串

时间:2019-04-20 21:53:07

标签: python pandas dataframe replace

我有一列看起来像这样的数据:

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中进行每次替换,因为这将花费很多时间。

有什么建议可以使我按原样使用applepearbanana变量吗?

2 个答案:

答案 0 :(得分:1)

更准确的解决方案是计算拼错单词和正确拼写单词之间的相似率。在Python可用的少数几个库中,我使用了Levenshtein库,该库具有一个ratio函数,该函数返回相似率。要获得比率很简单,例如:

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

答案 1 :(得分:1)

仅通过从列表中构造字典即可自动实现涉及手写拼写错误列表的简单(甚至可能是简化的)方法:

repl={s:n for n,l in [("apple",apple),("pear",pear),("banana",banana)]
      for s in l}

如果正确名称和拼写错误的列表位于某个数据结构(例如包含字典)中,则它们本身可以自动构建。 (可以将globals()locals()用作该词典,但随后必须过滤掉无关的条目。)