我有一个多行的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']
我已经通过我的方法收到了此输出,但是我确信从性能的角度来看,代码可以得到改进
答案 0 :(得分:1)
您可以改进的几件事:)
DataFrame.apply
函数。熊猫已经为您提供了“后台”循环播放的功能。df['cos_sim'] = df.apply(lambda _df: scipy.spatial.distance.cosine(_df[columnsA], _df[columnsB])
或类似的东西应该更有效
DataFrame.loc
df[df.index==row][columnsA]
和
df.loc[row,columnsA]
应该等效
for index, row in df.iterrows():
scipy.spatial.distance.cosine(row[columnsA], row[columnsB])