Python pandas中的Vectorize函数

时间:2017-03-10 10:46:37

标签: python pandas vectorization

我在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个参数。

谢谢!

1 个答案:

答案 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)

对于我的玩具示例,这速度相当快,但我不知道模糊函数需要什么,所以我不确定那里。

希望它有所帮助!