一個非常好用的 Python 魔法庫【文末查看上周中獎者】
點擊上方“Python 知識大全”,選擇“加為星標”
第一時間關(guān)注Python技術(shù)干貨!

【導語】:還在為日常工作中不同的數(shù)據(jù)集的字段進行匹配煩惱?今天跟大家分享FuzzyWuzzy一個簡單易用的模糊字符串匹配工具包。讓你多快好省的解決煩惱的匹配問題!
1. 前言

2. FuzzyWuzzy庫介紹
pip?install?-i?https://pypi.tuna.tsinghua.edu.cn/simple?FuzzyWuzzy
2.1 fuzz模塊

2.1.1 簡單匹配(Ratio)
fuzz.ratio("河南省", "河南省")>>> 100>fuzz.ratio("河南", "河南省")>>> 80
2.1.2 非完全匹配(Partial Ratio)
fuzz.partial_ratio("河南省", "河南省")>>> 100fuzz.partial_ratio("河南", "河南省")>>> 100
2.1.3 忽略順序匹配(Token Sort Ratio)
fuzz.ratio("西藏 自治區(qū)", "自治區(qū) 西藏")>>> 50fuzz.ratio('I love YOU','YOU LOVE I')>>> 30fuzz.token_sort_ratio("西藏 自治區(qū)", "自治區(qū) 西藏")>>> 100fuzz.token_sort_ratio('I love YOU','YOU LOVE I')>>>?100
2.1.4 去重子集匹配(Token Set Ratio)
fuzz.ratio("西藏 西藏 自治區(qū)", "自治區(qū) 西藏")> 40fuzz.token_sort_ratio("西藏 西藏 自治區(qū)", "自治區(qū) 西藏")> 80fuzz.token_set_ratio("西藏 西藏 自治區(qū)", "自治區(qū) 西藏")>?100
2.2 process模塊
2.2.1 extract提取多條數(shù)據(jù)
choices = ["河南省", "鄭州市", "湖北省", "武漢市"]process.extract("鄭州", choices, limit=2)> [('鄭州市', 90), ('河南省', 0)]#?extract之后的數(shù)據(jù)類型是列表,即使limit=1,最后還是列表,注意和下面extractOne的區(qū)別
2.2.2 extractOne提取一條數(shù)據(jù)
process.extractOne("鄭州", choices)>>> ('鄭州市', 90)process.extractOne("北京", choices)>>>?('湖北省',?45)
3. 實戰(zhàn)應用
3.1 公司名稱字段模糊匹配


3.1.1 參數(shù)講解:
3.1.2 核心代碼講解
s = df_2[key2].tolist()m = df_1[key1].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][0] if len([i[0] for i in x if i[1] >= threshold]) > 0 else '')#要理解第一個‘matches’字段返回的數(shù)據(jù)類型是什么樣子的,就不難理解這行代碼了#參考一下這個格式:[('鄭州市', 90), ('河南省', 0)]df_1['matches'] = m2return?df_1

4. 全部函數(shù)代碼
#模糊匹配def fuzzy_merge(df_1, df_2, key1, key2, threshold=90, limit=2):""":param df_1: the left table to join:param df_2: the right table to join:param key1: key column of the left table:param key2: key column of the right table:param threshold: how close the matches should be to return a match, based on Levenshtein distance:param limit: the amount of matches that will get returned, these are sorted high to low:return: dataframe with boths keys and matches"""s = df_2[key2].tolist()m = df_1[key1].apply(lambda x: process.extract(x, s, limit=limit))df_1['matches'] = mm2 = df_1['matches'].apply(lambda x: [i[0] for i in x if i[1] >= threshold][0] if len([i[0] for i in x if i[1] >= threshold]) > 0 else '')df_1['matches'] = m2return df_1from fuzzywuzzy import fuzzfrom fuzzywuzzy import processdf = fuzzy_merge(data, company, '公司名稱', '公司名稱', threshold=90)df
文末福利



這次送書規(guī)則很簡單,【除號主之外】規(guī)則如下:
????最近閱讀前十名中的第一名?and?最近分享前十名的第一名截圖如下 【數(shù)據(jù)來自訂閱號助手?App】 請?WGL 網(wǎng)網(wǎng) 和 Charline?在公眾號回復關(guān)鍵字【微信】聯(lián)系我。三天后無效!
關(guān)注「Python 知識大全」,做全棧開發(fā)工程師 歲月有你 惜惜相處 回復 【資料】獲取高質(zhì)量學習資料 好文章,我在看??
評論
圖片
表情


