Нечеткая строка, совпадающая с пандами и FuzzyWuzzy; KeyError: 'name' - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть файл данных, который выглядит следующим образом - wrong country names

И у меня есть другой файл данных, который имеет все правильные названия стран.Для сопоставления обоих файлов, которые я использую ниже:

from fuzzywuzzy import process
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



#Wrong country names dataset
df=pd.read_csv("wrong-country-names.csv",encoding="ISO-8859-1")
wrong_names=df['name'].dropna().values

#Correct country names dataset
choices_df=pd.read_csv("country-names.csv",encoding="ISO-8859-1")
correct_names=choices_df['name'].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))

Я получаю следующую ошибку:

runfile('C:/Users/Drashti Bhatt/Desktop/untitled0.py', wdir='C:/Users/Drashti Bhatt/Desktop')
Traceback (most recent call last):

  File "<ipython-input-155-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 17, in <module>
    wrong_names=df['name'].dropna().values

  File "C:\Users\Drashti Bhatt\Anaconda3\lib\site-packages\pandas\core\frame.py", line 2927, in __getitem__
    indexer = self.columns.get_loc(key)

  File "C:\Users\Drashti Bhatt\Anaconda3\lib\site-packages\pandas\core\indexes\base.py", line 2659, in get_loc
    return self._engine.get_loc(self._maybe_cast_indexer(key))

  File "pandas/_libs/index.pyx", line 108, in pandas._libs.index.IndexEngine.get_loc

  File "pandas/_libs/index.pyx", line 132, in pandas._libs.index.IndexEngine.get_loc

  File "pandas/_libs/hashtable_class_helper.pxi", line 1601, in pandas._libs.hashtable.PyObjectHashTable.get_item

      File "pandas/_libs/hashtable_class_helper.pxi", line 1608, in pandas._libs.hashtable.PyObjectHashTable.get_item

    KeyError: 'name'

Любая помощь по этому вопросу будет принята с благодарностью!Большое спасибо!

1 Ответ

0 голосов
/ 25 сентября 2019

Ваш код содержит, например, wrong_names=df['name'].dropna().values (он упоминается в вашей трассировке как «оскорбительная» строка).

А теперь посмотрите на изображение, представляющее ваш фрейм данных:

  • он не содержит столбец name,
  • содержит столбец Country.

Вернуться к трассировке: в самом конце появляется сообщение об ошибке: KeyError: 'name'.

Итак, вы пытаетесь получить доступ к несуществующему столбцу.

Я заметил еще одну деталь: атрибут values содержит базовый массив Numpy , тогда как Для process.extractOne требуются "обычные" Python списки (строк, для сопоставления).

Поэтому, вероятно, вам следует изменить приведенную выше инструкцию на:

wrong_names=df['Country'].dropna().values.tolist()

То же самое для другой инструкции.

...