pandas中余弦相似度的行计算,无需循环。

问题描述 投票:0回答:1

我有一个有很多行的pandas数据框df。对于每一行,我想计算行的列A(第一个向量)和行的列B(第二个向量)之间的余弦相似度。最后,我的目标是得到每行一个余弦相似度值的向量。我已经找到了一个解决方案,但在我看来,如果没有这个循环,似乎可以更快地完成。有人能给我一些关于这段代码的反馈吗?非常感谢您


for row in np.unique(df.index):
            cos_sim[row]=scipy.spatial.distance.cosine(df[df.index==row][columnsA], 
                                          df[df.index==row][columnsB])

df['cos_sim']=cos_sim

下面是一些样本数据。

df = pd.DataFrame({'featureA1': [2, 4, 1, 4],

                   'featureA2': [2, 4, 1, 4],

                   'featureB1': [10, 2, 1, 8]},

                   'featureB2': [10, 2, 1, 8]},

                  index=['Pit', 'Mat', 'Tim', 'Sam'])

columnsA=['featureA1', 'featureA2']
columnsB=['featureB1', 'featureB2']

这是我想要的输出 (Pit, Mat, Tim和Sam的余弦相似度):

cos_sim=[1, 1, 1, 1]

我已经用我的方法接收到了这个输出 但我相信从性能的角度来看,这段代码还可以改进一下

pandas performance loops trigonometry similarity
1个回答
0
投票

有几件事你可以改进:)

  1. 请看一下 DataFrame.apply pandas已经为你提供了 "引擎盖下 "的循环功能。
df['cos_sim'] = df.apply(lambda _df: scipy.spatial.distance.cosine(_df[columnsA], _df[columnsB])

或类似的东西应该更有性能

  1. 另外,请看一下 DataFrame.loc
df[df.index==row][columnsA]

df.loc[row,columnsA]

相当于

  1. 如果你真的要在数据框架上迭代(应该再次避免,因为性能惩罚,而且更难读懂),pandas给你提供了一个行(和id)的生成器。
for index, row in df.iterrows():
    scipy.spatial.distance.cosine(row[columnsA], row[columnsB])
  1. 最后如上所述,为了在stackoverflow上得到更好的答案,一定要提供一个具体的例子,问题是可以重现的。否则正确解读问题和检验解决方案就会困难很多。
© www.soinside.com 2019 - 2024. All rights reserved.