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

pandas的groupby操作返回的DataFrameGroupBy对象仅包含什么内容?

DataFrameGroupBy 底层原理说明

DataFrameGroupBy 既不是单纯的索引指针,也不会全量复制原始DataFrame的数据,它的内部结构分为两部分:

  • 持有原始DataFrame的直接引用,不会额外拷贝全量数据,这也是你复用GroupBy对象能提升运行速度的核心原因
  • 初始化时会预计算并缓存分组映射规则:也就是每个分组对应的行的整数位置下标、分组键的取值等信息,这部分计算是groupby()调用时的主要耗时点,计算完成后就不会再动态更新

对应现象解释

  1. 给原始df新增列后,旧的GroupBy对象可以正常使用新列
    因为GroupBy对象一直持有原df的引用,取列数据时会直接从当前关联的df中读取,预存的分组行下标也还是对应正确的行,所以操作可以正常执行。
    你初始化的代码如下:
c = df.groupby("SP")

后续给df加完新列后,直接调用类似c["SP"].cumsum()的操作完全可行。

  1. 删除原df的行后,旧的GroupBy对象返回的还是旧结果
    这种情况通常有两种原因:
  • 如果你是用df = df.drop(xxx)的方式删行,相当于把df变量指向了一个新的DataFrame对象,而原来的GroupBy对象持有的还是未删行的旧df的引用,自然会基于旧数据计算
  • 如果你是用df.drop(xxx, inplace=True)的方式在原对象上删行,此时预存的分组行下标已经和当前df的实际行位置不匹配,会导致计算结果出错或者还是返回基于旧行数量的结果

最佳实践

  • 仅对原始DataFrame做新增列操作时,可以复用已经生成的GroupBy对象,确实能提升运行效率
  • 只要对原始DataFrame做了行的增删、或者修改了分组键列的取值,必须重新生成GroupBy对象,不能复用之前的实例,否则会得到不符合预期的结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:45:03