我正在尝试通过在pandas数据帧的两列之间应用函数(jaccard字符串距离)来创建新列。我的数据框有大约4亿行。
df['sim_scr'] = df.apply(lambda x: jaccard(x[0],x[1],2),axis=1)
由于体积庞大,需要花费相当长的时间,所以我尝试将数据框拆分为块,应用函数并将它们连接起来。即使这需要很长时间:
for chunk in np.array_split(df,1000):
chunk['sim_scr'] = chunk.apply(lambda x: jaccard(x[0],x[1],2),axis=1)
df2 = df2.append(chunk)
有没有有效的方法来实现这一目标?
修改
这就是我定义Jaccard距离函数的方法:
def jaccard(a,b,n):
s = [a[i:i+n] for i in range(len(a)-n+1)]
t = [b[i:i+n] for i in range(len(b)-n+1)]
if len(list(set(s) | set(t))) >0:
jac_coeff = 1 - len(list(set(s) & set(t))) / len(list(set(s) | set(t)))
else:
jac_coeff = 1
return jac_coeff
示例数据帧:
nm1 nm2
John A Smith K
California Cadifornia
San Frans San Fransisco
答案 0 :(得分:0)
根据我的理解,使用矢量操作是最有效的方法。如果你将大行的矢量分成几行并进行计算,我认为它总的来说会慢一些。
而且,如果拆分合并,则需要一些时间来复制/合并大型矢量。
这种方式怎么样,将2 dim vector n * 2转换为3 dim,如n / 5 * 5 * 2,并找到另一个函数或lib,可以使用一个矢量。