You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas 2.2.2中groupby对象是否存储原DataFrame内容?

问题解析:Pandas GroupBy对象与原DataFrame的引用关系

问题背景

我有一个包含A、B、C三列的DataFrame,目标是验证groupby对象是否存储原DataFrame的副本。测试代码如下:

# 创建含A、B、C列的DataFrame
grp = df.groupby(by=['A', 'B'])
del df  
print(grp.transform(lambda x: x))  # 该行输出完整的DataFrame

上述代码似乎表明grp包含原DataFrame,因为原DataFrame已被删除,但grp仍能生成完整数据。该结论是否正确?是否可能grp持有原DataFrame的引用,执行del操作后引用计数未归零,导致数据仍驻留内存供grp使用?(使用Pandas版本为2.2.2)

核心结论与解释

  • 你的初始结论不准确:GroupBy对象并没有存储原DataFrame的副本,而是持有对原DataFrame数据的引用。
  • del df后grp仍能正常工作的原因:Python的垃圾回收机制基于引用计数。执行del df只是移除了变量名df对DataFrame对象的引用,但GroupBy对象内部(比如通过grp.obj属性)仍保留着对该DataFrame的引用,因此DataFrame对象的引用计数未归零,不会被垃圾回收,grp自然能继续访问数据。

结合Pandas 2.2.2的具体说明

在Pandas 2.2.2中,GroupBy对象的核心设计就是依赖原数据的引用而非副本:

  • 你可以直接通过grp.obj查看GroupBy绑定的原DataFrame对象(在del df之前,grp.obj is df会返回True,证明是同一个对象)。
  • 若在创建GroupBy后修改原DataFrame(比如df['C'] = df['C'] * 2),再调用grp.transform(lambda x: x)会返回修改后的数据,这进一步证明GroupBy使用的是原数据的引用,而非创建时的副本。

验证是否为副本的更直接方法

如果想明确验证GroupBy是否存储副本,可以做以下测试:

import pandas as pd

# 创建测试DataFrame
df = pd.DataFrame({'A': [1,1,2], 'B': ['x','x','y'], 'C': [10,20,30]})
grp = df.groupby(['A','B'])

# 修改原DataFrame
df['C'] = df['C'] + 5

# 查看GroupBy的结果
print(grp.sum())
# 输出会是修改后的值:A=1,B=x时C=40(15+25),A=2,B=y时C=35,证明GroupBy用的是原数据引用

内容的提问来源于stack exchange,提问作者user2585330

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 18:31:04