【问题标题】:Efficiently apply function on a large pandas dataframe在大熊猫数据框上有效地应用函数
【发布时间】: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 我添加了示例数据框

标签: pandas apply


【解决方案1】:

在我的理解中,用向量操作是最有效的方法。如果您将大行向量分成几行并计算,我认为它总体上会更慢。

而且,如果你拆分和合并,复制/合并大向量需要一些时间。

这样怎么样,将你的 2 dim 向量 n*2 转换为 3 dim ,例如 n/5 * 5 * 2,然后找到另一个可以使用该向量的函数或库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    • 2021-05-14
    • 2020-09-08
    • 2018-11-13
    • 1970-01-01
    • 2017-12-11
    相关资源
    最近更新 更多