Как заменить строку в Python из списка возможных строк - PullRequest
3 голосов
/ 21 апреля 2019

У меня есть столбец данных, который выглядит следующим образом:

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 переменные как есть?

Ответы [ 2 ]

1 голос
/ 21 апреля 2019

Простой (возможно, даже упрощенный) подход, включающий рукописные списки опечаток, может быть автоматизирован простым построением словаря из списков:

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

Список правильных имен и орфографических ошибок для каждого из них может быть составлен автоматически, если они находятся в некоторой структуре данных, например, в содержащем словарь. (Можно использовать globals() или locals() в качестве этого словаря, но тогда вам придется отфильтровать посторонние записи.)

1 голос
/ 21 апреля 2019

Более точным решением было бы вычисление отношения подобия между словом с ошибкой и словом, написанным правильно.Среди немногих библиотек, доступных в Python, я использовал библиотеку Левенштейна, которая имеет функцию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...