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
相关产品推荐
相关产品推荐

