我有一个有很多行的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]
我已经用我的方法接收到了这个输出 但我相信从性能的角度来看,这段代码还可以改进一下
有几件事你可以改进:)
DataFrame.apply
pandas已经为你提供了 "引擎盖下 "的循环功能。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])