Python 从一开始就使用一元/二进制数据创建csr_矩阵

Python 从一开始就使用一元/二进制数据创建csr_矩阵,python,pandas,scipy,sparse-matrix,Python,Pandas,Scipy,Sparse Matrix,我从一个包含列UserId和ItemId的数据框中的SQL导入二进制数据。我使用的是隐式/二进制数据,您可以在下面的pivot\u表中看到 虚拟数据 frame=pd.DataFrame() 帧['Id']=[21342345456565468768] 帧['ItemId']=[123456789101] 我知道如何使用以下工具在Pandas中创建pivot_表: print(frame.groupby(['Id','ItemId',sort=False).size().unstack(fil

我从一个包含列
UserId
ItemId
的数据框中的SQL导入二进制数据。我使用的是隐式/二进制数据,您可以在下面的
pivot\u表中看到

虚拟数据
frame=pd.DataFrame()
帧['Id']=[21342345456565468768]
帧['ItemId']=[123456789101]
我知道如何使用以下工具在Pandas中创建
pivot_表

print(frame.groupby(['Id','ItemId',sort=False).size().unstack(fill\u value=0))
项目ID 123 456 789 101
身份证件
2134      1    0    0    0
23454     0    1    0    0
5654      0    0    1    0
68768     0    0    0    1
并将其转换为一个
SciPy csr_矩阵
,但我想从一开始就创建一个稀疏矩阵,而不必从Pandas
df
转换。原因是我得到一个错误:
Unstacked DataFrame太大,导致int32溢出
,因为我的原始数据由
378.777
行组成

非常感谢您的帮助

我正试图做与这些答案相同的事情

但是我还没有
帧['count']
数据。

使用来实例化矩阵:

Id = [2134, 23454, 5654, 68768]
ItemId = [123, 456, 789, 101]

csrm = csr_matrix(([1]*len(Id), (Id,ItemId)))
结果:

<68769x790 sparse matrix of type '<class 'numpy.int32'>'
    with 4 stored elements in Compressed Sparse Row format>

我假设您可以以某种方式将数据值行读取到内存中的单独列表中,例如,就像您在示例中所做的那样(具有
Id
ItemId
的列表)。根据你帖子上的评论,我们也不希望重复。请注意,如果您有重复项,以下将不起作用

所提出的解决方案还引入了一个(稀疏)矩阵,它不像示例中所示的那样密集,因为我们将直接使用Id值作为矩阵/行条目

若要将它们传递给构造函数,请查看:

csr\u矩阵((数据,(行索引,列索引)),[shape=(M,N)])

其中
data
row\u ind
col\u ind
满足关系
a[row\u ind[k],col\u ind[k]=data[k]

这意味着我们可以直接将列表作为索引传递给稀疏矩阵,如下所示:

from scipy.sparse import csr_matrix
Id_values = load_values() # gets the list of entries as in the post example
ItemId_values = load_more_values()

sparse_mat = csr_matrix(([1]*len(Id_values), # entries will be filled with ones
                        (Id_values, ItemId_values)), # at those positions
                        shape=(max(Id_values)+1, max(ItemId_values)+1)) # shape is the respective maximum entry of each dimension

请注意,这不会给您任何排序,而是将值放在它们各自的Id位置,即第一对将保持在位置(2134134)而不是(0,0)

您是否希望数据中出现重复的值,即是否会出现多个元组,例如(2134123)?或者它们确实是独一无二的?我不希望在我的数据中出现重复的,这非常有趣!Id*项的组合(因此稀疏矩阵中的位置)永远不会重复,但是存在重复的Id和重复项。据我所知,这不是问题?是的,没错!它基本上输入不同的行/列位置。这就是为什么我要问这些复制品;-)