String Python模糊模糊错误字符串或缓冲区预期
我正在使用fuzzyfuzzy在公司名称的csv中查找近似匹配项。我将手动匹配的字符串与未匹配的字符串进行比较,希望找到一些有用的近似匹配,但是,我在fuzzywuzzy中得到了一个字符串或缓冲区错误。我的代码是: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
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如果你喜欢-anan
在选项中会通过导致失败。只有当你打印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]