【发布时间】:2019-02-14 19:34:24
【问题描述】:
背景
我有 2 个数据框,它们没有可以合并它们的通用键。两个 df 都有一个包含“实体名称”的列。一个 df 包含 8000 多个实体,另一个包含接近 2000 个实体。
样本数据:
vendor_df=
Name of Vendor City State ZIP
FREDDIE LEES AMERICAN GOURMET SAUCE St. Louis MO 63101
CITYARCHRIVER 2015 FOUNDATION St. Louis MO 63102
GLAXOSMITHKLINE CONSUMER HEALTHCARE St. Louis MO 63102
LACKEY SHEET METAL St. Louis MO 63102
regulator_df =
Name of Entity Committies
LACKEY SHEET METAL Private
PRIMUS STERILIZER COMPANY LLC Private
HELGET GAS PRODUCTS INC Autonomous
ORTHOQUEST LLC Governmant
问题说明:
我必须模糊匹配这两个(Name of vendor & Name of Entity) 列的实体并获得分数。因此,需要知道数据帧 1(vendor_df) 的第一个值是否与数据帧 2(regulator_df) 的 2000 个实体中的任何一个匹配。
我检查过的 StackOverflow 链接:
fuzzy match between 2 columns (Python)
create new column in dataframe using fuzzywuzzy
Apply fuzzy matching across a dataframe column and save results in a new column
代码
import pandas as pd
from fuzzywuzzy import fuzz
from fuzzywuzzy import process
vendor_df = pd.read_excel('C:\\Users\\40101584\\Desktop\\AUS CUB AML\\Vendors_Sheet.xlsx', sheet_name=0)
regulator_df = pd.read_excel('C:\\Users\\40101584\\Desktop\\AUS CUB AML\\Regulated_Vendors_Sheet.xlsx', sheet_name=0)
compare = pd.MultiIndex.from_product([vendor_df['Name of vendor'],
regulator_df['Name of Entity']]).to_series()
def metrics(tup):
return pd.Series([fuzz.ratio(*tup),
fuzz.token_sort_ratio(*tup)],
['ratio', 'token'])
#compare.apply(metrics) -- Either this works or the below line
result = compare.apply(metrics).unstack().idxmax().unstack(0)
以上代码的问题:
如果两个数据框都很小,则代码可以工作,但是当我提供完整的数据集时,它会花费很长时间。以上代码取自第三个链接。
如果同样的事情可以快速运行或可以处理大型数据集,任何解决方案?
更新 1
如果我们通过或硬编码一个分数,比如 80,上面的代码可以更快吗? 80 只过滤系列/数据帧,模糊分数 > 80?
【问题讨论】:
-
我遇到了同样的问题,但在这里你运行
compare.apply(metrics)两次,应用比率和令牌需要很长时间,也许你最好评论倒数第二行跨度> -
实际上我已经尝试了这两种方法......它们都对我来说是永远的
-
您应该尝试使用多进程或线程。
标签: python pandas fuzzy-logic fuzzy-comparison fuzzywuzzy