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

时间:2014-09-09 04:45:29

标签: python pandas dataframe cosine-similarity

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

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

3 个答案:

答案 0 :(得分:8)

这就是你要找的东西吗?

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

答案 1 :(得分:2)

您还可以使用cosine_similarity中的from sklearn.metrics.pairwise import cosine_similarity cosine_similarity(df.col1, df.col2) Out[4]: array([[0.7498213]]) 或其他相似性指标。

mySparkDataFrame.checkpoint(eager=True)

答案 2 :(得分:1)

在我的情况下,我有一个比较复杂的情况,我想比较的两列长度不同(换句话说,那里有一些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