gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:43:14 25 4
gpt4 key购买 nike

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

关于python-3.x - Groupby id 并在大矩阵 (3x3 mio.) 上展开(或求和),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52005524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com