从一开始就使用一元/二进制数据创建一个csr_matrix

时间:2019-07-09 11:10:53

标签: python pandas scipy sparse-matrix

我在由列UserIdItemId组成的pandas Dataframe中从SQL导入二进制数据。我正在使用隐式/二进制数据,如下面的pivot_table所示。

Dummy data

frame=pd.DataFrame()
frame['Id']=[2134, 23454, 5654, 68768]
frame['ItemId']=[123, 456, 789, 101]

我知道如何使用以下方法在熊猫中创建pivot_table

print(frame.groupby(['Id', 'ItemId'], sort=False).size().unstack(fill_value=0))

ItemId  123  456  789  101
Id
2134      1    0    0    0
23454     0    1    0    0
5654      0    0    1    0
68768     0    0    0    1

并将其转换为SciPy csr_matrix,但是我想从一开始就创建一个稀疏矩阵,而不必从熊猫df进行转换。这样做的原因是我得到一个错误:Unstacked DataFrame is too big, causing int32 overflow,因为我的原始数据由378.777行组成。

非常感谢您的帮助!

我正在尝试与这些答案Efficiently create sparse pivot tables in pandas?

相同

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

2 个答案:

答案 0 :(得分:1)

使用4th option实例化矩阵:

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>

答案 1 :(得分:0)

我假设您可以以某种方式将数据值的行读取到内存中的单独列表中,即,就像您在示例中所做的那样(具有IdItemId的列表)。根据您的评论,我们也不希望重复。请注意,如果您重复以下操作,则以下无效

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

如果要查看SciPy documentation,将它们传递给构造函数:

  

csr_matrix((data, (row_ind, col_ind)), [shape=(M, N)])

     

其中datarow_indcol_ind满足关系a[row_ind[k], col_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位置,即,第一对将保持在位置(2134,134)而不是(0,0)