【发布时间】:2018-04-21 01:03:21
【问题描述】:
我正在尝试通过在 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
【问题讨论】:
-
无论你申请什么都需要相当长的时间。你说
My dataframe has around 400 million rows.你必须去 numba 或相关的库来提高速度。完全不建议申请。 -
你最好找到一个不同的
jaccard函数来处理向量化操作,因为这是瓶颈。 -
@msksanthosh 放了数据框的样本,让我们也想出更好的东西。无需在您的数据样本上尝试我们的解决方案即可提出任何建议。
-
@cᴏʟᴅsᴘᴇᴇᴅ:我添加了我正在使用的功能
-
@Bharath 我添加了示例数据框