pandas 中无循环余弦相似度的逐行计算
row-wise calculation of cosine similarity in pandas without looping
我有一个包含很多行的 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 已经为您提供循环 "under the hood".
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]
应该是等价的
- 如果你真的必须遍历数据帧(由于性能损失,应该再次避免,并且更难以阅读和理解),pandas 为你提供行(和 id)的生成器
for index, row in df.iterrows():
scipy.spatial.distance.cosine(row[columnsA], row[columnsB])
- 最后,如上所述,为了在 Whosebug 上获得更好的答案,请始终提供一个可重现问题的具体示例。否则很难正确解释问题和测试解决方案。
相当老 post 但我正在为未来的读者回复。我为所有这些行 similarity/distance 计算创建了 https://github.com/ma7555/evalify(免责声明:我是包的所有者)
我有一个包含很多行的 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 已经为您提供循环 "under the hood".
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]
应该是等价的
- 如果你真的必须遍历数据帧(由于性能损失,应该再次避免,并且更难以阅读和理解),pandas 为你提供行(和 id)的生成器
for index, row in df.iterrows():
scipy.spatial.distance.cosine(row[columnsA], row[columnsB])
- 最后,如上所述,为了在 Whosebug 上获得更好的答案,请始终提供一个可重现问题的具体示例。否则很难正确解释问题和测试解决方案。
相当老 post 但我正在为未来的读者回复。我为所有这些行 similarity/distance 计算创建了 https://github.com/ma7555/evalify(免责声明:我是包的所有者)