计算 1 行数据框与 Python 中具有相同列的大型数据框的相似度?

Calculate similarity of 1-row dataframe and a large dataframe with the same columns in Python?

我有一个非常大的数据框(数百万行),每次我都得到一个具有相同列的 1 行数据框。 例如:

df = pd.DataFrame({'a': [1,2,3], 'b': [2,3,-1], 'c': [-1,0.4,31]})
input = pd.DataFrame([[11, -0.44, 4]], columns=list('abc'))

我想计算输入和整个 df 之间的余弦相似度。 我正在使用以下内容:

from scipy.spatial.distance import cosine
df.apply(lambda row: 1 - cosine(row, input), axis=1)

但是有点慢。尝试使用 swifter 包,它似乎 运行 更快。 请告知此类任务的最佳实践是什么,是这样做还是改用其他方法?

我通常不使用 DataFrame 进行矩阵操作,而是使用 numpy.array。所以我会先转换它们

df_npy = df.values
input_npy = input.values

然后我不想使用scipy.spatial.distance.cosine所以我会自己处理计算,即首先对每个向量进行归一化

df_npy = df_npy / np.linalg.norm(df_npy, axis=1, keepdims=True)
input_npy = input_npy / np.linalg.norm(input_npy, axis=1, keepdims=True)

然后矩阵相乘

df_npy @ input_npy.T

这会给你

array([[0.213],
       [0.524],
       [0.431]])

我不想使用 scipy.spatial.distance.cosine 的原因是它一次只处理一对向量,但在我展示的方式中,它同时处理所有向量.