计算pandas数据帧行之间的相似性

时间:2015-03-05 16:52:25

标签: 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]....}

1 个答案:

答案 0 :(得分:3)

  

除了我在代码的这一点上的主要目标之外的一个问题是我的数据帧仍然有NaN。

该遗产df.fillna不会修改DataFrame,但会返回一个新的。修复它,你的结果会很好。