TypeError при использовании FuzzyWuzzy и Pandas для сопоставления строк

Я получаю сообщение об ошибке при использовании библиотеки FuzzyWuzzy в Python 3. Я работаю с файлами CSV, также используя библиотеку Pandas.

У меня есть следующие данные в моем файле CSV:

> BBL          CorporationName               CorporationName2
  1            123 Elm St LLC                123 Elm St LLC    
  2            ABC Realty, INC               ABC Realty, INC     
  3            123 Elm Street, LLC           123 Elm Street, LLC 
  4            ABC Realty Incorporated       ABC Realty Incorporated        

Столбцы CorporationName и CorporationName2 на самом деле одинаковы. Каждый из них содержит названия компаний, связанных с недвижимостью. Эти названия этих предприятий появляются несколько раз в каждом столбце, но, как вы можете видеть, иногда они появляются в несколько разных проявлениях.

Моя цель — взять каждую строку в CorporationName и сравнить ее со всеми строками в CorporationName2. Затем я хотел бы, чтобы FuzzyWuzzy вернул 5 наиболее релевантных строк из CorporationName2 (т.е. возможные варианты этого имени). Это только первый шаг в огромной задаче сопоставления строк, которой я подверг себя.

> import pandas as pd
  from fuzzywuzzy import process
  from fuzzywuzzy import fuzz 
  import csv

  df = pd.read_csv('yescorp_fuzz.csv')
  test_list = df.CorporationName
  test_list1 = df.CorporationName1


  def ownermatch():
   for i in test_list:
     result = process.extract(i,test_list1, limit=5)
     print(result)


   ownermatch()

Это ошибка трассировки:

Traceback (most recent call last):
  File "C:/Python34/YesCorpFuzzy4_15.py", line 17, in <module>
    ownermatch()
  File "C:/Python34/YesCorpFuzzy4_15.py", line 13, in ownermatch
    result = process.extract(i,test_list1, limit=5)
  File "C:\Python34\lib\site-packages\fuzzywuzzy\process.py", line 103, in extract
    processed = processor(choice)
  File "C:\Python34\lib\site-packages\fuzzywuzzy\utils.py", line 84, in full_process
    string_out = StringProcessor.replace_non_letters_non_numbers_with_whitespace(s)
  File "C:\Python34\lib\site-packages\fuzzywuzzy\string_processing.py", line 25, in replace_non_letters_non_numbers_with_whitespace
    return cls.regex.sub(u" ", a_string)
TypeError: expected string or buffer
>>> 

Честно говоря, я не уверен, что здесь происходит. В интернете тоже многого не нашел.

Любая помощь, которую вы могли бы предоставить, будет принята с благодарностью.

Спасибо!


person Steven    schedule 15.04.2016    source источник


Ответы (1)


Я думаю, вы столкнулись с ситуацией, когда у вас есть нулевое значение или некоторый нестроковый тип данных в одном из столбцов фрейма данных. FuzzyWuzzy ожидает строку, и когда он встречает NaN или другую нестроку, выдает ошибку. Вы можете избавиться от этого, заполнив NaN значением другого столбца:

df.CorporationName.fillna(df.CorporationName1, inplace = True)
df.CorporationName1.fillna(df.CorporationName, inplace = True)

Или преобразование не строк:

df.loc[:, 'CorporationName'] = df.CorporationName.astype(str)
person Sam    schedule 15.04.2016
comment
Привет @Sam, как ни странно, он все еще возвращает ту же ошибку. Видимо дело в другом. - person Steven; 17.04.2016
comment
@Стивен, не могли бы вы иметь другие типы данных в вашем df? - person Sam; 17.04.2016
comment
вроде бы это было. Спасибо! - person Steven; 19.04.2016
comment
Круто рад помочь. Если вы хотите принять мой ответ или, по крайней мере, дать мне голосование здесь, я был бы признателен;) - person Sam; 19.04.2016
comment
абсолютно, извините, я забыл! По какой причине вы используете df.loc для преобразования строк? - person Steven; 21.04.2016
comment
Да, это способ избежать своеобразной ошибки панд: stackoverflow.com/questions/20625582/ - person Sam; 21.04.2016
comment
ты полон мудрости, мой друг. Я много раз неустанно работал над тем, чтобы избавить свой код от связанных триггеров присваивания, но никогда не думал, что это может быть причиной - person Steven; 22.04.2016