【问题标题】:TypeError when using FuzzyWuzzy and Pandas for string matching使用 FuzzyWuzzy 和 Pandas 进行字符串匹配时出现 TypeError
【发布时间】:2016-04-15 19:04:59
【问题描述】:

在 Python 3 中使用 FuzzyWuzzy 库时出现错误。我正在使用 Pandas 库处理 CSV 文件。

我的 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 从 CorporationName2 返回 5 个最相关的字符串(即该名称的可能变体)。这只是我所经历的大规模字符串匹配任务的第一步。

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

老实说,我不确定这里发生了什么。我在互联网上也找不到太多。

如果您能提供任何帮助,我们将不胜感激。

谢谢!

【问题讨论】:

    标签: csv python-3.x pandas fuzzywuzzy


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

    【讨论】:

    • 嗨@Sam,奇怪的是它仍然返回相同的错误。显然是别的东西。
    • @Steven 你可以在你的 df 中有其他数据类型吗?
    • 似乎就是这样。谢谢!
    • 很高兴为您提供帮助。如果你想接受我的回答,或者至少在这里给我一个赞成票,我会很感激;)
    • 绝对,对不起,我忘了!您使用 df.loc 转换字符串的任何原因?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 2018-01-09
    • 1970-01-01
    • 2019-05-27
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多