2017-01-01 14 views
0

ЦЕЛИFuzzyWuzzy - Цикл по списку, матч принимается значения и возвращает dataframe

  • Учитывая файл Excel (полный опечаток), используйте FuzzyWuzzy для сравнения и матча опечаток против accepted списка.
  • Исправьте заполненный опечатками файл Excel с ближайшим, accepted совпадением.

ПОДХОД

  1. Импорт Excel файл с пандами
  2. Нажмите оригинал, опечатка заполненного файла Excel в dataframe
  3. Создать accepted dataframe
  4. Сравнить опечатка dataframe с accepted dataframe с использованием FuzzyWuzzy
  5. Возврат первоначальное написание, принятое написание, и оценка совпадение
  6. Append связанные с ним, принял орфографию к первоначальным Ехчли/строки для всех вариантов написания

КОД

#Load Excel File into dataframe 
xl = pd.read_excel(open("/../data/expenses.xlsx",'rb')) 

excel dataframe

#Let's clarify how many similar categories exist... 
q = """ 
    SELECT DISTINCT Expense 
    FROM xl 
    ORDER BY Expense ASC 

""" 

expenses = sqldf(q) 
print(expenses) 

similar categories

#Let's add some acceptable categories and use fuzzywuzzy to match 
accepted = ['Severance', 'Legal Fees', 'Import & Export Fees', 'I.T. Fees', 'Board Fees', 'Acquisition Fees'] 

#select from the list of accepted values and return the closest match 
process.extractOne("Company Acquired",accepted,scorer=fuzz.token_set_ratio) 

('Приобретение Пошлины', 38) не высокий балл, но достаточно высоко, что он возвращает ожидаемый результат

!!!!! ВОПРОС !!!! !

#Time to loop through all the expenses and use FuzzyWuzzy to generate and return the closest matches. 
def correct_expense(expense): 
    for expense in expenses: 
     return expense, process.extractOne(expense,accepted,scorer = fuzz.token_set_ratio) 

correct_expense(expenses) 

('Расходы', ('Юридические платежи', 47))

ВОПРОСЫ

  1. Как вы можете видеть, process.extractOne работает правильно при проверке на индивидуальной основе. Однако при запуске в цикле возвращаемое значение является неожиданным. Я считаю, что могу захватить первый или последний столбец, но даже если бы это было так, я бы ожидал появления «Ревизии директора» или «Приобретения» (см. Оригинальный файл excel).
+0

Как минимум две проблемы в 'correct_expense()': вы возвращаетесь внутрь цикла, а имя параметра совпадает с переменной цикла. –

ответ

1

Как я уже делал это в прошлом, чтобы просто использовать функцию get_closest_matches из difflib модуля в Python. Затем вы можете создать функцию для получения ближайшего соответствия и применить ее к столбцу Expense.

def correct_expense(row): 
    accepted = ['Severance', 'Legal Fees', 'Import & Export Fees', 'I.T. Fees', 'Board Fees', 'Acquisition Fees'] 
    match = get_close_matches(row, accepted, n=1, cutoff=0.3) 
    return match[0] if match else '' 

df['Expense_match'] = df['Expense'].apply(correct_expense) 

Вот оригинальный Expense столбец со значениями соответствующих к accepted списка:

enter image description here

Вы, вероятно, нужно подстроить accepted список и значение cutoff для get_closest_matches (я нашел что 0,3 работал очень хорошо для ваших данных образца).

После того, как вы удовлетворены результатами, вы можете изменить функцию, чтобы перезаписать столбец Expense и сохранить в Excel с помощью метода pandas DataFrame to_excel.

 Смежные вопросы

  • Нет связанных вопросов^_^