Python 将用户/项目视图数据转换为二维度量

Python 将用户/项目视图数据转换为二维度量,python,pandas,numpy,multidimensional-array,recommendation-engine,Python,Pandas,Numpy,Multidimensional Array,Recommendation Engine,用户/项目视图数据如下所示 User Item Louis 1 Louis 2 Adam 1 Adam 3 我想把它转换成一个逐项的度量,比如 1 2 3 1 0 1 1 2 1 0 0 3 1 0 0 因此,每个值都表示“观看我也观看j的人数”。(对角线值无关紧要) 有什么有效的方法可以做到这一点吗 下面是我的代码,但当有大约50k个项目和500k个查看记录时,运行时间很长 import pandas as pd impo

用户/项目视图数据如下所示

User  Item 
Louis    1
Louis    2
Adam     1
Adam     3
我想把它转换成一个逐项的度量,比如

    1  2  3
1   0  1  1
2   1  0  0
3   1  0  0
因此,每个值都表示“观看我也观看j的人数”。(对角线值无关紧要)

有什么有效的方法可以做到这一点吗

下面是我的代码,但当有大约50k个项目和500k个查看记录时,运行时间很长

import pandas as pd
import numpy as np
from scipy.sparse import csr_matrix, lil_matrix
raw = pd.DataFrame(columns=['user','item'])
raw['user']=['Louis','Louis','Adam','Adam']
raw['item']=[1,2,1,3]

item_list = raw.item.unique().tolist()
user_list = raw.user.unique().tolist()
m = lil_matrix((len(raw.item.unique()),len(raw.item.unique())))
for user in user_list:
    temp = raw.loc[np.in1d(raw['user'], user)].item
    if len(temp) > 1:
        for idx1, id1 in enumerate(temp[0:-1]):
            for id2 in temp[idx1+1:]:
                m[item_list.index(id1),item_list.index(id2)]+=1
                m[item_list.index(id2),item_list.index(id1)]+=1
m.toarray()
你可以用

In [147]: dff = pd.crosstab(df.Item, df.User)

In [148]: dff = dff.dot(dff.T)

In [149]: np.fill_diagonal(dff.values, 0)

In [150]: dff
Out[150]:
Item  1  2  3
Item
1     0  1  1
2     1  0  0
3     1  0  0