【问题标题】:How to replace string in python from a list of possible strings如何从可能的字符串列表中替换python中的字符串
【发布时间】:2019-09-10 16:23:31
【问题描述】:

我有一列数据如下所示:

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']

如何遍历每一列以将拼写错误的水果更改为正确的水果。 IE。最终的数据框应如下所示:

    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 变量吗?

【问题讨论】:

  • 你的例子 dict replacements 倒退了吗?您只是在问如何以编程方式构建它?
  • 我不确定你的第一个问题是什么意思,但我想根据我已经用applebananapear 编码的内容对结果数据框进行编程变量。
  • 你的“我可以达到这个结果”的例子在字典中有两次相同的键。您是想避免使用这样的字典,还是只是想from上面单独的list变量?
  • 啊,对。我知道我可以使用替换字典将每个错误的拼写分配给正确的水果类型。但这需要很长时间才能输入所有这些。所以我不会避免使用这样的字典,但最好使用上面的list 变量。

标签: python pandas dataframe replace


【解决方案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

【讨论】:

  • 感谢您的回答,但我希望使用现有的水果类型列表来 100% 准确。这个答案很好,但如果将来我无法访问不正确拼写的设置列表。
【解决方案2】:

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

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

如果它们驻留在某些数据结构(如包含字典)中,则可以自动构建每个正确名称和拼写错误的列表。 (可以使用globals()locals() 作为字典,但是你必须过滤掉无关的条目。)

【讨论】:

  • 这正是我所希望的:使用字典中的现有列表作为替换。非常感谢。
猜你喜欢
  • 2021-12-19
  • 1970-01-01
  • 2019-01-30
  • 2022-12-10
  • 2021-05-22
  • 2022-01-02
  • 2010-10-20
  • 2013-05-01
  • 2017-06-22
相关资源
最近更新 更多