分组ID并在大型矩阵(3x3 mio)上进行堆栈(或求和)。

时间:2018-08-24 13:26:52

标签: python-3.x pandas scipy sparse-matrix

.csv文件中有一些数据,这些数据描述了网络中的连接。

        index  c     id_1   id_2
0           0  1        8     10
1           1  1        7     10
2           2  1        7     10
3           3  1  2189149     29
4           4  1       27     29

其中c表示连接。此数据的形状为(3114045, 4),占用约100 mb。

我想计算id_1与id_2连接的次数。我可以通过

完成此操作
adj_pivot = pd.pivot_table(data=df, 
                     index="id_1", 
                     columns="id_2", 
                     values="c", 
                     aggfunc=np.sum)

或者-更快-我可以

adj_group = df.groupby(["id_1", "id_2"]).size().unstack(fill_value=0)

无论哪种方式,这都会给我我想要的输出:

id_2     10   29
id_1            
7        2.0  0
8        1.0  0
27       0    1.0
2189149  0    1.0

我的问题是,如果我对熊猫进行上述数据透视/分组,则需要约5300 GB内存。

根据(3114045, 4),完整sys.getsizeof(scipy.sparse.csr_matrix(df))结构的稀疏版本占用56个字节。尝试使用100 000行的上述方法,然后使其稀疏,看来我可以将矩阵的大小压缩10^-8倍。


所以,我的问题是:我如何在稀疏结构上复制上述数据透视+和/ groupby +填充?如果无法做到这一点,是否有良好的策略来批量进行此操作?

我已经看过答案here,但对我来说还是有点神秘。

1 个答案:

答案 0 :(得分:0)

这应该有效:

grouped = df.groupby(["id_1", "id_2"]).size().reset_index()
values = grouped.values.T
scipy.sparse.csr_matrix((values[2], (values[0], values[1])))

<2189150x30 sparse matrix of type '<class 'numpy.int64'>'
    with 4 stored elements in Compressed Sparse Row format>