假设我在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
获取这两列的余弦相似性的最佳方法是什么?
答案 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