python - 计算 pandas 数据帧行之间的相似度

标签 python pandas dataframe cosine-similarity

目标是识别数据帧中每行的前 10 个相似行。

我从以下字典开始:

import pandas as pd
import numpy as np
from scipy.spatial.distance import cosine

d = {'0001': [('skiing',0.789),('snow',0.65),('winter',0.56)],'0002': [('drama', 0.89),('comedy', 0.678),('action',-0.42) ('winter',-0.12),('kids',0.12)],'0003': [('action', 0.89),('funny', 0.58),('sports',0.12)],'0004': [('dark', 0.89),('Mystery', 0.678),('crime',0.12), ('adult',-0.423)],'0005': [('cartoon', -0.89),('comedy', 0.678),('action',0.12)],'0006': [('drama', -0.49),('funny', 0.378),('Suspense',0.12), ('Thriller',0.78)],'0007': [('dark', 0.79),('Mystery', 0.88),('crime',0.32), ('adult',-0.423)]}

为了将其放入数据框中,我执行以下操作:

col_headers = []
entities = []
for key, scores in d.iteritems():
    entities.append(key)
    d[key] = dict(scores)
    col_headers.extend(d[key].keys())
col_headers = list(set(col_headers))

填充数据框:

df = pd.DataFrame(columns=col_headers, index=entities)
for k in d:
    df.loc[k] = pd.Series(d[k])
df.fillna(0.0, axis=1)

除了我在代码的主要目标之外的问题之一是我的数据帧仍然具有 NaN。这可能是我的结果矩阵充满 NaN 的原因。

     Mystery drama  kids winter  funny  snow crime  dark sports Suspense  adult skiing action comedy cartoon Thriller
0004   0.678   NaN   NaN    NaN    NaN   NaN  0.12  0.89    NaN      NaN -0.423    NaN    NaN    NaN     NaN      NaN
0005     NaN   NaN   NaN    NaN    NaN   NaN   NaN   NaN    NaN      NaN    NaN    NaN   0.12  0.678   -0.89      NaN
0006     NaN -0.49   NaN    NaN  0.378   NaN   NaN   NaN    NaN     0.12    NaN    NaN    NaN    NaN     NaN     0.78
0007    0.88   NaN   NaN    NaN    NaN   NaN  0.32  0.79    NaN      NaN -0.423    NaN    NaN    NaN     NaN      NaN
0001     NaN   NaN   NaN   0.56    NaN  0.65   NaN   NaN    NaN      NaN    NaN  0.789    NaN    NaN     NaN      NaN
0002     NaN  0.89  0.12  -0.12    NaN   NaN   NaN   NaN    NaN      NaN    NaN    NaN  -0.42  0.678     NaN      NaN
0003     NaN   NaN   NaN    NaN   0.58   NaN   NaN   NaN   0.12      NaN    NaN    NaN   0.89    NaN     NaN      NaN

要计算余弦相似度并生成行之间的相似度矩阵,我执行以下操作:

data = df.values
m, k = data.shape

mat = np.zeros((m, m))

for i in xrange(m):
    for j in xrange(m):
        if i != j:
            mat[i][j] = cosine(data[i,:], data[j,:])
        else:
            mat[i][j] = 0.

这是垫子的样子:

[[  0.  nan  nan  nan  nan  nan  nan]
 [ nan   0.  nan  nan  nan  nan  nan]
 [ nan  nan   0.  nan  nan  nan  nan]
 [ nan  nan  nan   0.  nan  nan  nan]
 [ nan  nan  nan  nan   0.  nan  nan]
 [ nan  nan  nan  nan  nan   0.  nan]
 [ nan  nan  nan  nan  nan  nan   0.]]

假设 NaN 问题得到修复,并且 mat 吐出含义完整的相似性矩阵。如何获得如下输出:

{0001:[003,005,002],0002:[0001, 0004, 0007]....}

最佳答案

One of the issue in addition to my main goal that I have at this point of the code is my dataframe still has NaN.

这是因为 df.fillna 不会修改 DataFrame,而是返回一个新的 DataFrame。修复它,你的结果就会很好。

关于python - 计算 pandas 数据帧行之间的相似度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28883303/

相关文章:

r - 使用 col1 或 col2 连接两个数据帧,然后添加结果

python - 将 str 转换为整数的有效方法

python - SpaCy 3 变压器矢量标记对齐

python - 如何根据 Pandas to_html 中的行条件格式化数字

python - 使用数据帧中的值作为键来替换第二个数据帧中的值

python - 将单独的 1D np.arrays 转换为 2D np.arrays 列表

python - 运算符(operator) 'is' 与方法的非常奇怪的行为

python - 用于路径规划神经网络的 keras 自定义指标不起作用

python pandas调用函数时出现未绑定(bind)本地错误 'df.apply'

Python Pandas Dataframe 替换低于阈值的值