大熊猫中的groupby会创建数据的副本还是只是视图?

时间:2018-10-09 00:41:52

标签: python pandas

pandas.DataFrame.groupby是创建数据的副本还是仅创建视图?在(不大可能)不创建副本的情况下,额外的内存开销是多少?它如何根据原始数据帧特性(例如行数,列数,不同的组)进行缩放?

2 个答案:

答案 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操作?

如果这是您要的内容,我想答案是“否”,只要您存储分组操作的结果,它就不会像视图。分组的数据帧或系列的输出对象是一个(新的)数据帧或系列。