Как заменить слова с ошибками в панде - PullRequest
3 голосов
/ 07 июня 2019

У меня есть 2 панды DataFrames.Один из них содержит список слов с правильной написанием:

[In]: df1
[Out]:
   words
0  apple
1  phone
2  clock
3  table
4  clean

, а другой со словами с ошибками:

[In]: df2
[Out]:
   misspelled
0        aple
1         phn
2        alok
3     garbage
4        appl
5         pho

Цель состоит в том, чтобы заменить столбец слов с ошибками во втором кадре данных, используя списокправильно написанных слов из первого DataFrame.Второй DataFrame может иметь несколько повторений, может иметь размер, отличный от первого, может содержать слова, которых нет в первом DataFrame (или не достаточно похожи для соответствия).

Я пыталсяиспользовать difflib.get_close_matches с некоторым успехом, но он не работает идеально.

Это то, что я имею до сих пор:

x = list(map(lambda x: get_close_matches(x, df1.col1), df2.col1))
good_words = list(map(''.join, x))
l = np.array(good_words, dtype='object')
df2.col1 = pd.Series(l)
df2 = df2[df2.col1 != '']

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

[In]: df2
[Out]:
          0
0     apple
1     phone
2     clock
3       NaN
4     apple
5     phone

Если совпадений не найдено, строка заменяется на NaN.Моя проблема в том, что я получаю результат, который выглядит следующим образом:

[In]: df2
[Out]:
    misspelled
0        apple
1        phone
2   clockclean
3          NaN
4        apple
5        phone

На момент написания статьи я не понял, почему некоторые слова объединяются.Я подозреваю, что это как-то связано с difflib.get_close_matches соответствием разных слов, которые имеют одинаковую длину и / или буквы.До сих пор я получаю около 10% - 15% слов, собранных таким образом, из целого столбца.Заранее спасибо.

1 Ответ

3 голосов
/ 07 июня 2019

Если требуется совпадение, первое значение, возвращаемое get_close_matches, используйте next с iter для возможного добавления значения, если нет совпадения - здесь np.nan:

x = [next(iter(x), np.nan) 
          for x in map(lambda x: difflib.get_close_matches(x, df1.words), df2.misspelled)]
df2['col1'] = x

print (df2)
  misspelled   col1
0       aple  apple
1        phn  phone
2       alok  clock
3    garbage    NaN
4       appl  apple
5        pho  phone
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...