我正在尝试通过在 pandas 数据框的两列之间应用一个函数(jaccard 字符串距离)来创建一个新列。我的数据框有大约 4 亿行。
df['sim_scr'] = df.apply(lambda x: jaccard(x[0],x[1],2),axis=1)
由于体积庞大,需要相当长的时间,所以我尝试将数据帧拆分为多个 block ,应用该函数并将它们连接回去。即使这也需要很长时间:
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
最佳答案
在我看来,用vector进行运算是最有效的方式。如果你把你的大行向量分成几行并计算,我认为它总共会更慢。
而且,如果你拆分和合并,复制/合并大向量将需要一些时间。
这样如何,将 2 个暗向量 n*2 转换为 3 个暗向量,例如 n/5 * 5 * 2,然后找到另一个可以处理该向量的函数或库。
关于pandas - 在大型 Pandas 数据框上有效地应用功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47178077/