Python 3.x Groupby id和在大型矩阵(3x3 mio)上取消堆叠(或求和)

Python 3.x Groupby id和在大型矩阵(3x3 mio)上取消堆叠(或求和),python-3.x,pandas,scipy,sparse-matrix,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表示连接。此数据为shape(31140

我在一个.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
表示连接。此数据为shape
(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

我的问题是,如果我使用pandas执行上述pivot/groupby,我将需要约5300 GB的ram

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


因此,我的问题是:如何在稀疏结构上复制上述pivot+sum/groupby+fill?如果不能做到这一点,是否有一个好的策略来分批做到这一点

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

这应该有效:

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>
grouped=df.groupby([“id_1”,“id_2”]).size().reset_index()
值=分组的.values.T
scipy.sparse.csr_矩阵((值[2],(值[0],值[1]))