pandas分组调用apply方法前两组重复执行两次的原因咨询
原因说明
该重复执行现象是pandas 1.0.x及周边旧版本的固有设计:groupby.apply在正式处理全部分组前,会先调用1~2个分组执行传入的自定义函数,目的是预判返回值的类型、结构,以此确定最终输出结果的拼接方式。这部分预热调用的结果不会被计入最终返回值,但函数内部的打印、变量修改等副作用都会被触发,所以会看到前两个分组的内容被打印了两次。
该行为和是否使用idxmax没有直接关联,若更换函数逻辑后没有出现重复打印,大概率是新的返回值结构足够简单,pandas在第一次预热调用时就完成了类型判断,没有触发第二次试探。
解决方法
1. 升级pandas版本
pandas 1.3及以上版本优化了groupby.apply的预热逻辑,大幅减少了不必要的重复调用,升级后即可避免该问题。
2. 改用原生pandas操作实现需求
如果暂时无法升级版本,可以换用更高效的原生pandas方法实现需求,不需要自定义apply:
# 方法1:直接取每个分组weight最大值对应的行 res = df.loc[df.groupby('animal')['weight'].idxmax(), ['animal', 'size']] # 方法2:分组前按体重降序排序,取每个分组第一条 res = df.sort_values('weight', ascending=False).groupby('animal').head(1)[['animal', 'size']]
以上实现都是pandas原生向量化操作,执行效率比自定义apply高,也不会触发重复调用的问题。
3. 调整groupby参数(兼容性一般)
也可以通过设置groupby的sort=False参数减少部分试探场景,不过该方法生效场景有限,更推荐上面两种方案。
内容的提问来源于stack exchange,提问作者gelu
相关产品推荐
相关产品推荐

