首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >FuzzyWuzzy -循环遍历列表,匹配接受的值,并返回数据

FuzzyWuzzy -循环遍历列表,匹配接受的值,并返回数据
EN

Stack Overflow用户
提问于 2017-01-01 11:24:31
回答 2查看 5K关注 0票数 1

目标

  • 给定一个excel文件(满是排字),使用FuzzyWuzzy来比较和匹配accepted列表中的输入。
  • 使用最接近的accepted匹配更正填充错误的excel文件.

逼近

  1. 用熊猫导入Excel文件
  2. 将原始的、错误填充的excel文件推入数据文件。
  3. 创建accepted数据
  4. 使用accepted比较错误数据和FuzzyWuzzy数据
  5. 返回原始拼写、接受的拼写和匹配的分数。
  6. 将关联的、接受的拼写附加到所有拼写的原始excel文件/行中。

代码语言:javascript
运行
AI代码解释
复制
#Load Excel File into dataframe
xl = pd.read_excel(open("/../data/expenses.xlsx",'rb'))

代码语言:javascript
运行
AI代码解释
复制
#Let's clarify how many similar categories exist... 
q = """
    SELECT DISTINCT Expense 
    FROM xl
    ORDER BY Expense ASC

"""

expenses = sqldf(q)
print(expenses)

代码语言:javascript
运行
AI代码解释
复制
#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)不算高分,但足够高,足以返回预期的产出

!!!!!ISSUE!!!!!

代码语言:javascript
运行
AI代码解释
复制
#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文件)。
EN

回答 2

Stack Overflow用户

发布于 2017-01-02 12:58:37

我过去这样做的方法是只使用来自Python中的get_closest_matches模块的difflib函数。然后,您可以创建一个函数来获得最接近的匹配,并将其应用到Expense列。

代码语言:javascript
运行
AI代码解释
复制
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列表相匹配:

您可能需要微调accepted列表和get_closest_matchescutoff值(我发现0.3对于示例数据非常有用)。

一旦您对结果感到满意,就可以更改函数以覆盖Expense列,并使用DataFrame方法to_excel保存到Excel中。

票数 3
EN

Stack Overflow用户

发布于 2020-12-19 04:11:57

这被称为地名录重叠。

通过将凌乱的数据与规范数据(即公报)进行匹配,可以执行去重复操作。

熊猫完全可以做到这一点。

示例:

代码语言:javascript
运行
AI代码解释
复制
import pandas as pd
import pandas_dedupe

clean_data = pd.DataFrame({'street': ['Onslow square', 'Sydney Mews', 'Summer Place', 'Bury Walk', 'sydney mews']})
messy_data = pd.DataFrame({'street_name':['Onslow sq', 'Sidney Mews', 'Summer pl', 'Onslow square', 'Bury walk', 'onslow sq', 'Bury Wall'],
                           'city' : ['London', 'London', 'London', 'London', 'London', 'London', 'London']})

dd = pandas_dedupe.gazetteer_dataframe(
    clean_data, 
    messy_data, 
    field_properties = 'street_name', 
    canonicalize=True,
    )

在这个过程中,熊猫会要求你把几个例子标记为重复的或不同的记录。然后,图书馆将利用这些知识找到潜在的重复条目,将它们与干净的数据进行匹配,并返回所有相关信息,包括对结果的信心。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41418287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档