pandas的groupby操作返回的DataFrameGroupBy对象仅包含什么内容?
DataFrameGroupBy 底层原理说明
DataFrameGroupBy 既不是单纯的索引指针,也不会全量复制原始DataFrame的数据,它的内部结构分为两部分:
- 持有原始DataFrame的直接引用,不会额外拷贝全量数据,这也是你复用GroupBy对象能提升运行速度的核心原因
- 初始化时会预计算并缓存分组映射规则:也就是每个分组对应的行的整数位置下标、分组键的取值等信息,这部分计算是
groupby()调用时的主要耗时点,计算完成后就不会再动态更新
对应现象解释
- 给原始df新增列后,旧的GroupBy对象可以正常使用新列
因为GroupBy对象一直持有原df的引用,取列数据时会直接从当前关联的df中读取,预存的分组行下标也还是对应正确的行,所以操作可以正常执行。
你初始化的代码如下:
c = df.groupby("SP")
后续给df加完新列后,直接调用类似c["SP"].cumsum()的操作完全可行。
- 删除原df的行后,旧的GroupBy对象返回的还是旧结果
这种情况通常有两种原因:
- 如果你是用
df = df.drop(xxx)的方式删行,相当于把df变量指向了一个新的DataFrame对象,而原来的GroupBy对象持有的还是未删行的旧df的引用,自然会基于旧数据计算 - 如果你是用
df.drop(xxx, inplace=True)的方式在原对象上删行,此时预存的分组行下标已经和当前df的实际行位置不匹配,会导致计算结果出错或者还是返回基于旧行数量的结果
最佳实践
- 仅对原始DataFrame做新增列操作时,可以复用已经生成的GroupBy对象,确实能提升运行效率
- 只要对原始DataFrame做了行的增删、或者修改了分组键列的取值,必须重新生成GroupBy对象,不能复用之前的实例,否则会得到不符合预期的结果
内容的提问来源于stack exchange,提问作者Borut Flis
相关产品推荐
相关产品推荐

