Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 模糊字符串与Pandas和fuzzyfuzzy匹配,数据匹配:TypeError:无法在类似字节的对象上使用字符串模式_Python 3.x_Pandas_Fuzzywuzzy - Fatal编程技术网

Python 3.x 模糊字符串与Pandas和fuzzyfuzzy匹配,数据匹配:TypeError:无法在类似字节的对象上使用字符串模式

Python 3.x 模糊字符串与Pandas和fuzzyfuzzy匹配,数据匹配:TypeError:无法在类似字节的对象上使用字符串模式,python-3.x,pandas,fuzzywuzzy,Python 3.x,Pandas,Fuzzywuzzy,我有这样的数据文件- 我还有另一个数据文件,它有所有正确的国家名称。 为了匹配我在下面使用的两个文件: import pandas as pd names_array=[] ratio_array=[] def match_names(wrong_names,correct_names): for row in wrong_names: x=process.extractOne(row, correct_names) names_array.app

我有这样的数据文件-

我还有另一个数据文件,它有所有正确的国家名称。

为了匹配我在下面使用的两个文件:

import pandas as pd


names_array=[]
ratio_array=[]
def match_names(wrong_names,correct_names):
    for row in wrong_names:
        x=process.extractOne(row, correct_names)
        names_array.append(x[0])
        ratio_array.append(x[1])
    return names_array,ratio_array

fields = ['name']
#Wrong country names dataset
df=pd.read_csv("wrong-country-names.csv",encoding="ISO-8859-1",sep=';', skipinitialspace=True, usecols= fields )
print(df.dtypes)


wrong_names=df.dropna().values


#Correct country names dataset
choices_df=pd.read_csv("country-names.csv",encoding="ISO-8859-1",sep='\t', skipinitialspace=True)
correct_names=choices_df.values

name_match,ratio_match=match_names(wrong_names,correct_names)

df['correct_country_name']=pd.Series(name_match)
df['country_names_ratio']=pd.Series(ratio_match)

df.to_csv("string_matched_country_names.csv")

print(df[['name','correct_country_name','country_names_ratio']].head(10))
我得到以下错误:

name    object
dtype: object
Traceback (most recent call last):

  File "<ipython-input-221-a1fd87d9f661>", line 1, in <module>
    runfile('C:/Users/Drashti Bhatt/Desktop/untitled0.py', wdir='C:/Users/Drashti Bhatt/Desktop')

  File "C:\Users\Drashti Bhatt\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile
    execfile(filename, namespace)

  File "C:\Users\Drashti Bhatt\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/Drashti Bhatt/Desktop/untitled0.py", line 27, in <module>
    name_match,ratio_match=match_names(wrong_names,correct_names)

  File "C:/Users/Drashti Bhatt/Desktop/untitled0.py", line 9, in match_names
    x=process.extractOne(row, correct_names)

  File "C:\Users\Drashti Bhatt\Anaconda3\lib\site-packages\fuzzywuzzy\process.py", line 220, in extractOne
    return max(best_list, key=lambda i: i[1])

  File "C:\Users\Drashti Bhatt\Anaconda3\lib\site-packages\fuzzywuzzy\process.py", line 78, in extractWithoutOrder
    processed_query = processor(query)

  File "C:\Users\Drashti Bhatt\Anaconda3\lib\site-packages\fuzzywuzzy\utils.py", line 95, in full_process
    string_out = StringProcessor.replace_non_letters_non_numbers_with_whitespace(s)

  File "C:\Users\Drashti Bhatt\Anaconda3\lib\site-packages\fuzzywuzzy\string_processing.py", line 26, in replace_non_letters_non_numbers_with_whitespace
    return cls.regex.sub(" ", a_string)

TypeError: expected string or bytes-like object  
name对象
数据类型:对象
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
runfile('C:/Users/Drashti-Bhatt/Desktop/untitled0.py',wdir='C:/Users/Drashti-Bhatt/Desktop')
文件“C:\Users\Drashti Bhatt\Anaconda3\lib\site packages\spyder\u kernels\customize\spyderrcustomize.py”,第827行,在runfile中
execfile(文件名、命名空间)
文件“C:\Users\Drashti Bhatt\Anaconda3\lib\site packages\spyder\u kernels\customize\spyderrcustomize.py”,第110行,在execfile中
exec(编译(f.read(),文件名,'exec'),命名空间)
文件“C:/Users/Drashti Bhatt/Desktop/untitled0.py”,第27行,在
名称匹配,比率匹配=匹配名称(错误名称,正确名称)
文件“C:/Users/Drashti Bhatt/Desktop/untitled0.py”,第9行,匹配名称
x=进程.extractOne(行,正确的\u名称)
文件“C:\Users\Drashti Bhatt\Anaconda3\lib\site packages\fuzzywuzzy\process.py”,第220行,在extractOne中
返回最大值(最佳_列表,key=lambda i:i[1])
文件“C:\Users\Drashti Bhatt\Anaconda3\lib\site packages\fuzzywuzzy\process.py”,第78行,按顺序提取
已处理\u查询=处理器(查询)
文件“C:\Users\Drashti Bhatt\Anaconda3\lib\site packages\fuzzywuzzy\utils.py”,第95行,处于完整过程中
string\u out=StringProcessor。将\u非\u字母\u非\u数字\u替换为\u空格
文件“C:\Users\Drashti Bhatt\Anaconda3\lib\site packages\fuzzywuzzy\string\u processing.py”,第26行,将非字母非数字替换为空白
返回cls.regex.sub(“,一个字符串)
TypeError:应为字符串或类似字节的对象
我尝试了.decode选项,但没有成功。我做错了什么?
在此方面的任何帮助都将不胜感激!多谢

下面的代码正在运行。你可以找到不同之处。但我不确定这是否是您正在寻找的解决方案。我还尝试了手动创建的示例文件。我已从
pd.read\u csv
中删除
字段

(…=与您的代码相同)

输出

Country         object
alpha-2         object
alpha-3         object
country-code     int64
iso_3166-2      object
region          object
sub-region      object
region-co        int64
sub-region.1     int64
dtype: object
[[u'elbenie' u'AL' u'ALB' 8 u'ISO 3166-2:AL' u'Europe' u'Southern Europe'
  150 39]
 [u'enforre' u'AD' u'AND' 20 u'ISO 3166-2:AD' u'Europe' u'Southern Europe'
  150 39]
 [u'Belerus' u'AT' u'AUT' 40 u'ISO 3166-2:AT' u'Europe' u'Western Europe'
  150 155]]
[[u'elbenie']
 [u'enforre']
 [u'Belerus']]
('row=', array([u'elbenie', u'AL', u'ALB', 8, u'ISO 3166-2:AL', u'Europe',
       u'Southern Europe', 150, 39], dtype=object))
('row=', array([u'enforre', u'AD', u'AND', 20, u'ISO 3166-2:AD', u'Europe',
       u'Southern Europe', 150, 39], dtype=object))
('row=', array([u'Belerus', u'AT', u'AUT', 40, u'ISO 3166-2:AT', u'Europe',
       u'Western Europe', 150, 155], dtype=object))
  correct_country_name  country_names_ratio
0            [elbenie]                   60
1            [enforre]                   60
2            [Belerus]                   60

国家名称是什么样子的?您也可以尝试
pd.read_csv(“错误的国家名称.csv”,encoding=“ISO-8859-1”,skipinitialspace=True)
。这与我的代码相同,带有额外的sep=”;”。你能粘贴country-names.csv文件吗?因为我尝试了一个示例文件,并以我显示的方式导入,所以它对我来说运行良好,没有任何错误。请查看有问题的图片。我已经在那里添加了截图。你能分享你的代码吗?我也试过你的方法。但仍然会出现相同的错误。@DrashtiBhatt您可以在
处理之前打印
类型(行)
类型(正确名称)
打印(行)
打印(正确名称)
。提取一个(行,正确名称)
并粘贴输出。
Country         object
alpha-2         object
alpha-3         object
country-code     int64
iso_3166-2      object
region          object
sub-region      object
region-co        int64
sub-region.1     int64
dtype: object
[[u'elbenie' u'AL' u'ALB' 8 u'ISO 3166-2:AL' u'Europe' u'Southern Europe'
  150 39]
 [u'enforre' u'AD' u'AND' 20 u'ISO 3166-2:AD' u'Europe' u'Southern Europe'
  150 39]
 [u'Belerus' u'AT' u'AUT' 40 u'ISO 3166-2:AT' u'Europe' u'Western Europe'
  150 155]]
[[u'elbenie']
 [u'enforre']
 [u'Belerus']]
('row=', array([u'elbenie', u'AL', u'ALB', 8, u'ISO 3166-2:AL', u'Europe',
       u'Southern Europe', 150, 39], dtype=object))
('row=', array([u'enforre', u'AD', u'AND', 20, u'ISO 3166-2:AD', u'Europe',
       u'Southern Europe', 150, 39], dtype=object))
('row=', array([u'Belerus', u'AT', u'AUT', 40, u'ISO 3166-2:AT', u'Europe',
       u'Western Europe', 150, 155], dtype=object))
  correct_country_name  country_names_ratio
0            [elbenie]                   60
1            [enforre]                   60
2            [Belerus]                   60