Python实现字符串模糊匹配详解

 更新时间:2023年11月23日 09:53:55   作者:mYlEaVeiSmVp  
这篇文章主要为大家详细介绍了Python实现字符串模糊匹配的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解下

Python实现字符串模糊匹配及其在实战中的应用

在实际开发中,经常需要根据一个字段的值来查找另一个表格中对应的值,这时候就可以使用表格关联函数VLOOKUP。但是,在实际数据处理中,我们经常遇到输入的字符串有一些变体,这对于精确匹配是很困难的。因此,在本篇文章中,我们将探讨如何使用 Python 实现字符串模糊匹配,并介绍其在实际应用中的具体案例。

字符串模糊匹配的核心思想

字符串模糊匹配的核心思想是利用字符串的相似度计算函数,根据输入的字符串和已知的字符串进行比较,并返回一个相似度得分。其中,常用的相似度计算方法包括:

  • Levenshtein Distance(编辑距离)
  • Jaccard Similarity(Jaccard相似系数)
  • Cosine Similarity(余弦相似度)

本文将使用编辑距离作为相似度计算的方法,编辑距离定义为把一个字符串转化成另一个字符串所需的最少操作次数。

针对字符串模糊匹配的Python库:fuzzywuzzy

由于字符串模糊匹配在实际应用中较为普遍,因此在 Python 中也有相应的库来支持字符串模糊匹配。其中,fuzzywuzzy 是比较常用的一个库。

安装方法:

pip install fuzzywuzzy
pip install python-Levenshtein

代码实现

使用Python实现vlookup 字符串模糊匹配

下面我们将通过示例来演示如何使用 Python 实现 vlookup 字符串模糊匹配。

首先,我们需要导入必要的库:

from fuzzywuzzy import fuzz
import pandas as pd

然后,我们定义一个函数 fuzzy_merge,该函数使用编辑距离来计算两个字符串之间的相似度。具体代码如下所示:

def fuzzy_merge(df_1, df_2, key1, key2, threshold=90, limit=2):
    """
    使用编辑距离比较两列字符串,并返回相似度高于阈值的结果
    :param df_1: 需要合并的 DataFrame #1
    :param df_2: 需要合并的 DataFrame #2
    :param key1: 在 DataFrame #1 中进行比较的列名
    :param key2: 在 DataFrame #2 中进行比较的列名
    :param threshold: 设定的相似度阈值,默认为 90
    :param limit: 指定最多允许匹配的数量,默认为 2
    :return: 合并后的 DataFrame
    """
    s = df_2[key2].tolist()
    m = pd.Series(df_1[key1].tolist()).apply(lambda x: process.extract(x, s, limit=limit))
    df_1['matches'] = m
    m2 = df_1['matches'].apply(lambda x: [i[0] for i in x if i[1] >= threshold] if len(x) > 0 else [])
    df_1 = df_1.assign(matches=m2)
    return df_1

以上代码中,我们使用了 fuzz.extract 函数来计算两个字符串之间的相似度,并返回相似度得分。这里的 process 对象是 fuzzywuzzy 库中的一个模块,我们需要将输入的字符串与目标字符串列表一一比较,以求得最相似的结果。通过设置阈值和限制,我们可以控制匹配结果的质量和数量。

为了检验函数的正确性,我们还可以创建以下示例数据:

data1 = {'Name': ['Bill Smith', 'Mary Brown', 'John Johnson', 'Lisa Simpson'],
         'Age': [30, 25, 40, 20]}
data2 = {'Name': ['John Jonson', 'Lisa Simpson', 'Alison Jameson', 'Steve White'],
         'Income': [50000, 40000, 60000, 55000]}
df1 = pd.DataFrame(data1, columns=['Name', 'Age'])
df2 = pd.DataFrame(data2, columns=['Name', 'Income'])

然后我们就可以使用 fuzzy_merge 函数将两个 DataFrame 进行合并了。

result = fuzzy_merge(df1, df2, 'Name', 'Name', threshold=80)

最终输出的结果如下所示:

NameAgematchesIncome
Bill Smith30[]NaN
Mary Brown25[]NaN
John Johnson40[‘John Jonson’]50000
Lisa Simpson20[‘Lisa Simpson’] 40000

可以看到,我们成功地根据相似度进行了匹配,并将匹配后的结果和原始数据合并在了一起。

应用案例:基于字符串模糊匹配的公司合并

除了 VLOOKUP 函数的应用,字符串模糊匹配在实际数据处理中还有许多应用场景。比如,在公司合并、收购等业务中,经常需要将两个公司的数据进行合并。在这种情况下,由于两个公司名称可能存在轻微的变化(比如大小写、连字符等),直接使用精确匹配往往会导致一些数据漏掉。

为了解决这个问题,我们可以使用 fuzzywuzzy 库来计算公司名称之间的相似度,并进行合并。以下是一个简单的示例,以说明如何利用字符串模糊匹配来实现公司数据的合并。

我们可以定义一个函数 fuzzy_company_merge 来完成这个任务:

def fuzzy_company_merge(df, company1, company2):
    """
    使用模糊匹配方法合并两个公司的数据
    :param df: 包含两个公司数据的 DataFrame
    :param company1: 第一个公司的名称
    :param company2: 第二个公司的名称
    :return: 合并后的 DataFrame
    """
    mask1 = df['公司名称'].apply(lambda x: fuzz.partial_ratio(x, company1)) > 80
    mask2 = df['公司名称'].apply(lambda x: fuzz.partial_ratio(x, company2)) > 80
    sub_df1 = df[mask1]
    sub_df2 = df[mask2]
    result = pd.concat([sub_df1, sub_df2], axis=0)
    return result

以上代码中,我们使用了 fuzz.partial_ratio 函数来计算公司名称之间的相似度,并将相似度得分大于 80 的结果筛选出来进行合并。

接下来,我们使用以下示例数据来演示函数的使用方法:

data = {'公司名称': ['Apple Inc.', 'Google Inc.', 'Amazon.com Inc.', 'Microsoft Corporation', 'Alphabet Inc.'],
        '市值(亿美元)': [2076, 1364, 1558, 1642, 1543]}
df = pd.DataFrame(data, columns=['公司名称', '市值(亿美元)'])

现在,如果我们想合并 Apple 和 Alphabet 两家公司的数据,只需要调用 fuzzy_company_merge 函数即可:

result = fuzzy_company_merge(df, 'Apple Inc.', 'Alphabet Inc.')

最终输出的结果如下所示:

公司名称市值(亿美元)
Apple Inc.2076
Alphabet Inc.1543

可以看到,我们成功地将两个公司的数据合并在了一起。

到此这篇关于Python实现字符串模糊匹配详解的文章就介绍到这了,更多相关Python字符串模糊匹配内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python 默认参数相关知识详解

    python 默认参数相关知识详解

    这篇文章主要介绍了python 默认参数相关知识详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Python实现连接postgresql数据库的方法分析

    Python实现连接postgresql数据库的方法分析

    这篇文章主要介绍了Python实现连接postgresql数据库的方法,结合实例形式分析了Python基于psycopg2和python3-postgresql链接postgresql数据库的相关操作技巧,需要的朋友可以参考下
    2017-12-12
  • django xadmin实现自定义页面并且权限控制方式

    django xadmin实现自定义页面并且权限控制方式

    这篇文章主要介绍了django xadmin实现自定义页面并且权限控制方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • PyQt5 matplotlib画图不刷新的解决方案

    PyQt5 matplotlib画图不刷新的解决方案

    这篇文章主要介绍了PyQt5 matplotlib画图不刷新的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Python数据分析基础之异常值检测和处理方式

    Python数据分析基础之异常值检测和处理方式

    这篇文章主要介绍了Python数据分析基础之异常值检测和处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • 探索 Python Restful 接口测试的奥秘

    探索 Python Restful 接口测试的奥秘

    掌握Python Restful 接口测试,让你的后端服务像流水一样顺畅,本指南将带你轻松穿梭于断言和请求之间,搞定所有测试难题,一起来看,让代码在你的指尖跳舞吧!
    2023-12-12
  • python监控nginx端口和进程状态

    python监控nginx端口和进程状态

    这篇文章主要为大家详细介绍了python监控nginx端口和进程状态,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • 一篇文章带你了解python正则表达式的正确用法

    一篇文章带你了解python正则表达式的正确用法

    这篇文章主要介绍了Python中正则表达式的详细教程,正则表达式是Python学习进阶当中的重要内容,需要的朋友可以参考下
    2021-08-08
  • Python标准库之typing的用法(类型标注)

    Python标准库之typing的用法(类型标注)

    这篇文章主要介绍了Python标准库之typing的用法(类型标注),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • python3 cvs将数据读取为字典的方法

    python3 cvs将数据读取为字典的方法

    今天小编就为大家分享一篇python3 cvs将数据读取为字典的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12

最新评论