Pandas 0.25至1.3版本groupby transform搭配any()的行为变更问题
Pandas groupby.transform搭配any()行为变更原因说明
行为变更的核心原因
- Pandas 0.25.x及更早版本中,
any()方法对object类型序列的返回存在非预期实现:当序列内存在真值(非空字符串、非零数值等)时,会直接返回第一个真值本身而非布尔值,你之前的代码其实是依赖了这个bug级别的特性。 - 从Pandas 1.0版本开始,官方重构了逻辑聚合函数的底层实现,统一了
any()/all()的返回规则:无论输入序列的dtype是什么,最终都会返回布尔标量True/False,和Python原生的any()行为对齐。所以你升级到1.3.4后,x.any()返回的是布尔值True,赋值到允许空值的列时,布尔值会被强制转换为浮点数1.0,就出现了你遇到的问题。
推荐解决方案
你提到的两种方案都可以解决问题,其中更符合Pandas风格、性能也更优的是直接用transform('first'),代码如下:
calculated["balance_status"] = df.groupby(["group"])["balance_status"].transform('first')
这个方法会自动跳过组内的空值,返回第一个非空结果,完全匹配你“组内有状态值就全组赋值该值,否则为空”的需求,不需要额外写自定义lambda,执行效率也更高。
内容的提问来源于stack exchange,提问作者davenenglish
相关产品推荐
相关产品推荐

