熊猫中余弦相似度的逐行计算

时间:2020-06-12 07:55:05

标签: pandas performance loops trigonometry similarity

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

 const SocketInstance = socketio.connect('http://localhost:3000', {
    query: {
        token: window.localStorage.getItem('auth')
    }
});

Vue.use(new VueSocketIO({
    debug: true,
    connection: SocketInstance
}));

以下是一些示例数据:


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

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

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']

我已经通过我的方法收到了此输出,但是我确信从性能的角度来看,代码可以得到改进

1 个答案:

答案 0 :(得分:1)

您可以改进的几件事:)

  1. 看看DataFrame.apply函数。熊猫已经为您提供了“后台”循环播放的功能。
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. 如果您真的必须遍历数据帧(由于性能下降,应再次避免,并且更难于阅读和理解),熊猫会为您提供行(和id)的生成器
for index, row in df.iterrows():
    scipy.spatial.distance.cosine(row[columnsA], row[columnsB])
    最后,如上所述,要在stackoverflow上获得更好的答案,请始终提供可重现该问题的具体示例。否则,很难正确地解释问题并测试解决方案。