我在pandas数据框的2列中有一组类似的声音名称,我在python中使用fuzzywuzzy库进行模糊匹配。
import pandas as pd
from fuzzywuzzy import fuzz
datt = pd.read_csv("H:\\FuzzyMatch\\data.csv")
#add column names for each library
datt['ratio'] = ""
datt['partial_ratio'] = ""
datt['partial_token_set_ratio'] = ""
datt['partial_token_sort_ratio'] = ""
datt['QRatio'] = ""
datt['token_set_ratio'] = ""
datt['token_sort_ratio'] = ""
datt['UQRatio'] = ""
datt['UWRatio'] = ""
datt['WRatio'] = ""
#save score
for i in range(datt.shape[0]):
datt.ratio.loc[i] = fuzz.ratio(datt.current_company[i],datt.crm_company_name[i])
datt.partial_ratio.loc[i] = fuzz.partial_ratio(datt.current_company[i],datt.crm_company_name[i])
datt.partial_token_set_ratio.loc[i] = fuzz.partial_token_set_ratio(datt.current_company[i],datt.crm_company_name[i])
datt.partial_token_sort_ratio.loc[i] = fuzz.partial_token_sort_ratio(datt.current_company[i],datt.crm_company_name[i])
datt.QRatio.loc[i] = fuzz.QRatio(datt.current_company[i],datt.crm_company_name[i])
datt.token_set_ratio.loc[i] = fuzz.token_set_ratio(datt.current_company[i],datt.crm_company_name[i])
datt.token_sort_ratio.loc[i] = fuzz.token_sort_ratio(datt.current_company[i],datt.crm_company_name[i])
datt.UQRatio.loc[i] = fuzz.UQRatio(datt.current_company[i],datt.crm_company_name[i])
datt.UWRatio.loc[i] = fuzz.UWRatio(datt.current_company[i],datt.crm_company_name[i])
datt.WRatio.loc[i] = fuzz.WRatio(datt.current_company[i],datt.crm_company_name[i])
有什么方法可以避免循环并使用函数的矢量化形式?循环中的每个函数都需要2个参数。
谢谢!
答案 0 :(得分:2)
您可以在数据框上使用逐行应用。这是一个玩具示例:
import pandas as pd
def multiply(x,y):
return x*y
df = pd.DataFrame({"a": range(1,10000), "b": range(1,10000)})
df["c"] = df.apply(lambda x: multiply(x.a, x.b), 1)
在我看来,这将使你通过避免循环使代码变得更清晰 - 但我认为这不会提高性能。
您可以尝试使用numpy.vectorize:
import numpy as np
df["c"] = np.vectorize(multiply, otypes=["O"]) (df.a, df.b)
对于我的玩具示例,这速度相当快,但我不知道模糊函数需要什么,所以我不确定那里。
希望它有所帮助!