.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,但对我来说还是有点神秘。
答案 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>