pandas - 在大型 Pandas 数据框上有效地应用功能

标签 pandas apply

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

相关文章:

python - 垂直堆叠列表 - 无法迭代它们?

R:更改单元格中的值,如果其上方和下方的值彼此匹配,而不使用 for 循环

c++ - 使用 std::apply 应用可变参数函数

Python:pandas apply 与 map

python - 使用 Python 将索引设置为 csv 文件中重复行值的组

python - 使用列表中的索引值从大型数据帧创建较小的数据帧

python - 从时间序列数据中聚合重叠的 "all-previous-events"特征 - 在 Python 中

R 使用行和列的公式创建矩阵

在 R 中多次运行 'prop.test'

python - Pandas 使用列作为后缀进行透视