Groupby id 并在大矩阵 (3x3 mio.) 上展开(或求和)

Groupby id and unstack (or sum) on a large matrix (3x3 mio.)

我在描述网络连接的 .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

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

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


所以,我的问题是:如何在稀疏结构上复制上述 pivot+sum/groupby+fill?如果做不到,有没有好的分批做的策略?

我已经看过答案 here,但对我来说它似乎仍然有点神秘。

这应该有效:

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>