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

在没有循环的情况下按行计算 pandas 中的余弦相似度

使用 sklearn 计算两个不同列的单独 tfidf 分数

python - Pandas - FillNa 与另一个具有相似列的非空行