繁体   English   中英

Python pandas:查找两列的余弦相似度

[英]Python pandas: Finding cosine similarity of two columns

假设我在 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

获取这两列的余弦相似度的最佳方法是什么?

这就是你要找的吗?

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"]))

您还可以使用cosine_similarity或其他类似指标从sklearn.metrics.pairwise

from sklearn.metrics.pairwise import cosine_similarity

cosine_similarity(df.col1, df.col2)
Out[4]: array([[0.7498213]])

在我的情况下,我遇到了更复杂的情况,我想比较的 2 列的长度不同(换句话说,有一些 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM