【发布时间】:2017-10-30 01:12:19
【问题描述】:
我有一个 Pandas 数据框,它有两列,每一列的每一行都包含一个 SciPy 稀疏向量。这些向量是来自 csr 矩阵的行(因此它们实际上是形状为 1x8500 的矩阵)。
我需要创建另一列,该列的每一行都应包含同一行前两列的向量之间的点积。
我知道如何在每一行上使用apply / map,但是当我处理具有数百万行的数据集时需要很长时间。有没有更快的方法在整个数据帧上执行此操作?
除了点积之外,我还需要计算余弦相似度,但据我所知,这可能来自点积。
更新:我无法在此处分享实际数据,但这是一个玩具示例(请注意,我现在只有生成的数据框):
import pandas as pd
import numpy as np
from scipy.sparse import csr_matrix
row = np.array([0, 0, 1, 2, 2, 2])
col = np.array([0, 2, 2, 0, 1, 2])
data = np.array([1, 2, 3, 4, 5, 6])
mat = csr_matrix((data, (row, col)), shape=(3, 3))
df = pd.DataFrame({'Col_1': [mat.getrow(i) for i in range(3)],
'Col_2': [mat.getrow(i)*2 for i in range(3)]})
我知道我可以做这样的事情来计算点积:
df['Col_3'] = df.apply(lambda row: np.dot(row['Col_1'],
row['Col_2'].transpose()).toarray()[0][0], axis=1)
但是有没有更有效的方法来计算Col_3?
【问题讨论】:
-
能否提供一个小的可重现样本数据集和想要的数据集?
-
要明确一点:数据框中的项目真的是稀疏向量吗?有些东西告诉我这是次优的设计。你真的需要把熊猫带入画面吗?
-
你的数据集有多大?
-
@AndrasDeak 严格来说,它们是仅包含一行和大约 8500 列的稀疏矩阵 (csr)。我尝试使用 pandas,因为自定义代码需要更多测试。
-
@WR 他们是几千万行。在这些结构上使用
apply和np.dot让我等了几十分钟。
标签: python pandas scipy sparse-matrix dot-product