在大型pandas数据帧上有效地应用函数

时间:2017-11-08 11:05:06

标签: pandas apply

我正在尝试通过在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

1 个答案:

答案 0 :(得分:0)

根据我的理解,使用矢量操作是最有效的方法。如果你将大行的矢量分成几行并进行计算,我认为它总的来说会慢一些。

而且,如果拆分合并,则需要一些时间来复制/合并大型矢量。

这种方式怎么样,将2 dim vector n * 2转换为3 dim,如n / 5 * 5 * 2,并找到另一个函数或lib,可以使用一个矢量。