Python pandas:查找两列的余弦相似度
Posted
技术标签:
【中文标题】Python pandas:查找两列的余弦相似度【英文标题】:Python pandas: Finding cosine similarity of two columns 【发布时间】:2014-11-02 09:59:59 【问题描述】:假设我在 python pandas.DataFrame 中有两列:
col1 col2
item_1 158 173
item_2 25 191
item_3 180 33
item_4 152 165
item_5 96 108
获取这两列的余弦相似度的最佳方法是什么?
【问题讨论】:
为清楚起见,我假设您的意思是:除了简单地应用公式,即计算幅度、归一化和求和积。 @leo 是的,我的意思是什么是最优化的方式。但是,如果有一种只需要几行代码的函数式方法,我也会很高兴的。 Scipy好像有相关函数 【参考方案1】:这就是你要找的吗?
from scipy.spatial.distance import cosine
from pandas import DataFrame
df = DataFrame("col1": [158, 25, 180, 152, 96],
"col2": [173, 191, 33, 165, 108])
print(1 - cosine(df["col1"], df["col2"]))
【讨论】:
总是欢迎一个班轮,谢谢!我认为我过于关注在 python pandas 本身中寻找功能,而不是研究它集成的包,比如 scipy。 请注意,如果您有两个具有不同索引的不同系列,则余弦相似度计算将忽略NaN
值,从而导致错误答案,因为分母中的范数将被错误地计算(一些值将被删除以与其他系列保持一致)【参考方案2】:
您还可以使用cosine_similarity
或来自sklearn.metrics.pairwise 的其他相似性指标。
from sklearn.metrics.pairwise import cosine_similarity
cosine_similarity(df.col1, df.col2)
Out[4]: array([[0.7498213]])
【讨论】:
我使用了df['col1'].values.reshape(1, -1)
和df['col2'].values.reshape(1, -1)
来实现这个功能。【参考方案3】:
在我的情况下,我的情况有点复杂,我想比较的两列长度不同(换句话说,存在一些 NaN 值)。在这种情况下,接受的答案中表示的方法不能按原样工作(它输出 nan)。
所以,我使用了以下小技巧来解决它。首先,您将 2 列感兴趣的列连接到一个新的数据框中。然后你放弃NaN。之后,这两列只有对应的行,您可以将它们与余弦距离或您希望的任何其他成对距离进行比较。
import pandas as pd
from scipy.spatial import distance
index = ['item_1', 'item_2', 'item_3', 'item_4', 'item_5']
cols = [pd.Series([158, 25, 180, 152, 96], index=index, name='col1'),
pd.Series([173, 191, 33, 165, 108], index=index, name='col2'),
pd.Series([183, 204, 56], index=['item_1', 'item_4', 'item_5'], name='col3')]
df = pd.concat(cols, axis=1)
print(df)
print(distance.cosine(df['col2'], df['col3']))
输出:
col1 col2 col3
item_1 158 173 183.0
item_2 25 191 NaN
item_3 180 33 NaN
item_4 152 165 204.0
item_5 96 108 56.0
nan
你要做的是:
tdf = pd.concat([df['col2'], df['col3']], axis=1).dropna()
print(tdf)
print(distance.cosine(tdf['col2'], tdf['col3']))
输出是:
col2 col3
item_1 173 183.0
item_4 165 204.0
item_5 108 56.0
0.02741129579408741
【讨论】:
以上是关于Python pandas:查找两列的余弦相似度的主要内容,如果未能解决你的问题,请参考以下文章
PYSPARK:如何在 pyspark 数据框中找到两列的余弦相似度?
在 Python Pandas 中查找两列的交集 -> 字符串列表
Python Pandas 计算两列的 value_counts 并使用 groupby