pandas.DataFrame.groupby
是创建数据的副本还是仅创建视图?在(不大可能)不创建副本的情况下,额外的内存开销是多少?它如何根据原始数据帧特性(例如行数,列数,不同的组)进行缩放?
答案 0 :(得分:1)
groupby code in pandas有点复杂,因此很难从基本原理中找出来。快速测试表明,随着数据的增长,内存使用量似乎在增长,更多的组=更多的内存,但似乎并没有制作完整副本或任何东西:
In [7]: df = pd.DataFrame(np.random.random((1000,5)))
In [8]: def ret_df(df):
...: return df
In [9]: def ret_gb_df(df):
...: return df, df.groupby(0).mean()
In [10]: %memit ret_df(df)
peak memory: 75.91 MiB, increment: 0.00 MiB
In [11]: %memit ret_gb_df(df)
peak memory: 75.96 MiB, increment: 0.05 MiB
In [12]: df = pd.DataFrame(np.random.random((100000,5)))
In [13]: %memit ret_df(df)
peak memory: 79.76 MiB, increment: -0.02 MiB
In [14]: %memit ret_gb_df(df)
peak memory: 94.88 MiB, increment: 15.12 MiB
In [15]: df = pd.DataFrame(np.random.random((1000000,5)))
In [16]: %memit ret_df(df)
peak memory: 113.98 MiB, increment: 0.01 MiB
In [17]: %memit ret_gb_df(df)
peak memory: 263.14 MiB, increment: 149.16 MiB
In [18]: df = pd.DataFrame(np.random.choice([0,1,2,3], (1000000, 5)))
In [19]: %memit ret_df(df)
peak memory: 95.34 MiB, increment: 0.00 MiB
In [20]: %memit ret_gb_df(df)
peak memory: 166.91 MiB, increment: 71.56 MiB
答案 1 :(得分:0)
自从有人要求我帮助他们解决这个问题以来,我对此进行了更多研究,并且自从编写了可接受的答案以来,熊猫的源代码已经过一些修改。
根据我从源代码中可以看到的信息:
Groupby返回Grouper对象上的组(即Grouper.groups),它们是“a specification for a groupby instruction”.
好,那是什么意思?
“Groupers are ultimately index mappings.”
我一直认为这是groupby在创建一个新对象的意思。它不是原始数据帧的完整副本,因为您正在执行选择和聚合。因此,从某种意义上讲,它更像是一种转变。
如果视图的定义类似于this:“视图只不过是存储在数据库中且具有关联名称的SQL语句。视图实际上是表格形式的表的组成预定义的SQL查询”,那么我想知道您是否真正要问的是,是否每次在同一数据帧上执行相同的分组时都必须重新应用groupby操作?
如果这是您要的内容,我想答案是“否”,只要您存储分组操作的结果,它就不会像视图。分组的数据帧或系列的输出对象是一个(新的)数据帧或系列。