Вычисление сходства между строками кадра данных pandas

Цель состоит в том, чтобы определить 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]....}

person add-semi-colons    schedule 05.03.2015    source источник


Ответы (1)


Одна из проблем в дополнение к моей основной цели, которую я имею на этом этапе кода, заключается в том, что мой фрейм данных все еще имеет NaN.

Это потому, что df.fillna не изменяет DataFrame, а возвращает новый. Исправьте это, и ваш результат будет в порядке.

person Mika    schedule 05.03.2015
comment
в качестве альтернативы вы можете использовать аргумент inplace=True. - person James; 05.03.2015