计算 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
的原因是它一次只处理一对向量,但在我展示的方式中,它同时处理所有向量.
我有一个非常大的数据框(数百万行),每次我都得到一个具有相同列的 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
的原因是它一次只处理一对向量,但在我展示的方式中,它同时处理所有向量.