String Python模糊模糊错误字符串或缓冲区预期

String Python模糊模糊错误字符串或缓冲区预期,string,python-2.7,fuzzywuzzy,String,Python 2.7,Fuzzywuzzy,我正在使用fuzzyfuzzy在公司名称的csv中查找近似匹配项。我将手动匹配的字符串与未匹配的字符串进行比较,希望找到一些有用的近似匹配,但是,我在fuzzywuzzy中得到了一个字符串或缓冲区错误。我的代码是: from fuzzywuzzy import process from pandas import read_csv if __name__ == '__main__': df = read_csv("usm_clean.csv", encoding = "ISO-8859

我正在使用fuzzyfuzzy在公司名称的csv中查找近似匹配项。我将手动匹配的字符串与未匹配的字符串进行比较,希望找到一些有用的近似匹配,但是,我在fuzzywuzzy中得到了一个字符串或缓冲区错误。我的代码是:

from fuzzywuzzy import process
from pandas import read_csv

if __name__ == '__main__':
    df = read_csv("usm_clean.csv", encoding = "ISO-8859-1")
    df_false = df[df['match_manual'].isnull()]  
    df_true = df[df['match_manual'].notnull()]
    sss_false = df_false['sss'].values.tolist()
    sss_true = df_true['sss'].values.tolist()


    for sssf in sss_false:
        mmm = process.extractOne(sssf, sss_true) # find best choice
        print sssf + str(tuple(mmm))
这会产生以下错误:

Traceback (most recent call last):
File "fuzzywuzzy_usm2_csv_test.py", line 21, in <module>
mmm = process.extractOne(sssf, sss_true) # find best choice
File "/usr/local/lib/python2.7/site-packages/fuzzywuzzy/process.py", line 123, in extractOne
best_list = extract(query, choices, processor, scorer, limit=1)
File "/usr/local/lib/python2.7/site-packages/fuzzywuzzy/process.py", line 84, in extract
processed = processor(choice)
File "/usr/local/lib/python2.7/site-packages/fuzzywuzzy/utils.py", line 63, in full_process
string_out = StringProcessor.replace_non_letters_non_numbers_with_whitespace(s)
File "/usr/local/lib/python2.7/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

您的
sss\u true
变量包含:

[
    u'N21 LTD.',
    u'N2 CHECK LIMITED',
    u'N2 CHECK LTD',
    u'N2 GROUP LTD',
    u'N2 VISUAL COMMUNICATIONS LTD',
    u'N3 DISPLAY GRAPHICS LTD',
    u'N3O LIMITED',
    u'N9 DESIGN',
    nan              # <---- note this
]
[
u'N21有限公司,
u'N2支票有限公司',
u'N2支票有限公司,
u'N2集团有限公司,
u'N2视觉通信有限公司,
u'N3 DISPLAY GRAPHICS LTD',
u'N3O LIMITED',
u'N9设计',
nan#默认情况下,将字符串
'N/A'
解析为非数字(
nan

在您的示例中,这意味着您将得到一个
nan
值,而不是一个字符串

底部第三行(您在问题中突出显示的那一行)导致
sss_false[-3]==nan

最后一行的结果是
sss\u true[-1]==nan


选择1 如果要将字符串
'N/A'
解析为字符串而不是
nan
,方法是替换

df = read_csv("usm_clean.csv", encoding = "ISO-8859-1")

这些额外选项的含义如中所述

na_值:类似或dict的列表,默认为无

要识别为NA/NaN的其他字符串。如果传递了dict,则指定每列NA值

保留默认值\u na:布尔,默认值为真

如果指定了na_值且keep_default_na为False,则会覆盖默认NaN值,否则会将其附加到

因此,上面的修改告诉pandas将空字符串识别为NA,并放弃默认值
'N/A'


选择2 如果要放弃第一列中带有
'N/A'
的行,则需要从
sss\u true
sss\u false
中删除
nan
成员。一种方法是:

sss_true = [x for x in sss_true if type(x) != str]
sss_false = [x for x in sss_false if type(x) != str]

你能提供一些示例数据吗?如果没有任何示例数据,就很难处理它。我试图通过添加一个
isinstance
测试来测试字符串的出现情况,但没有成功。我的csv是800k行,因此我将经历一个分解csv的过程,以分离出有问题的行(叹气)。当我找到它时,将发布令人不快的数据。非常感谢,非常有用。有一个问题,为什么
#N/A
(从底部算起的第三个)会触发错误而
N/A
不会触发它?(我运行的代码相同,两行都会触发
nan
返回)。在
'N/A'
中将
nan
放入
sss\u false
列表中,而在底线上的
'N/A'
将nan放入
sss\u true
列表中(由于
'match\u manual'
列中的值)因此,两者都会将
nan
放入一个列表中,但效果会有所不同,这取决于它是否在作为
query
传递给
extractOne()的值中
,或者作为
选项
。我想你可能有点误判了你的错误。如果我从文件中删除
“#N/A”
行,我仍然会收到错误。如果我删除最后一行,我会收到不同的错误。如果我同时删除这两行,或者按照答案修复,它会起作用。我希望能澄清一些问题-我可以插入对github c的引用odebase如果你喜欢-a
nan
在选项中会通过导致失败。只有当你打印sssf+str(tuple(mmm))
时,查询中的nan才会导致失败,此时你正试图连接一个
float
和一个
str
。如果这一切都清除了,请接受:)不,那太好了(很明显)我忘记了我们在不同的时间对弦的处理是不同的。
df = read_csv("usm_clean.csv", encoding = "ISO-8859-1", keep_default_na=False, na_values='')
sss_true = [x for x in sss_true if type(x) != str]
sss_false = [x for x in sss_false if type(x) != str]