Pandas 0.22迁移咨询:透视表sum聚合返回0而非NaN的问题
解决Pandas 0.22透视表sum聚合返回0而非NaN的问题
我之前也碰到过Pandas版本升级后这个聚合行为的变化,正好可以给你详细说下怎么调整回0.20的逻辑:
问题根源
Pandas 0.22对sum聚合的默认行为做了修改:在无有效数据时,旧版本(0.20)返回NaN,新版本默认返回0。官方文档提到的min_count参数就是用来控制这个行为的——它指定聚合时至少需要多少个非NA值才返回计算结果,否则返回NaN。
代码修改方案
原来的代码用元组指定聚合函数,没法直接给sum传参数,我们需要把aggfunc改成字典形式,针对sum单独设置min_count:
方案1:用lambda包装sum函数
workload_pivot_df = pd.pivot_table( workload_df, index=["athlete_id", "date"], values=["workload"], columns=["type"], aggfunc={ "workload": [ lambda x: x.sum(min_count=1), # 设置min_count=1,无数据返回NaN "last" ] } )
方案2:用functools.partial更优雅地封装
如果觉得lambda不够直观,可以用partial来封装带参数的sum函数:
from functools import partial # 预先定义带min_count参数的sum聚合函数 sum_with_nan = partial(pd.Series.sum, min_count=1) workload_pivot_df = pd.pivot_table( workload_df, index=["athlete_id", "date"], values=["workload"], columns=["type"], aggfunc={"workload": [sum_with_nan, "last"]} )
效果验证
设置min_count=1后,当某个分组下没有有效workload数据时,sum列会返回NaN,和你在0.20版本中的表现完全一致;如果去掉这个参数,就会回到0.22默认的返回0的逻辑。
注意事项
如果你的透视表涉及多个values列,只需要在aggfunc字典里给对应列的sum聚合函数加上min_count参数即可,其他聚合函数(比如这里的last)不受影响。
内容的提问来源于stack exchange,提问作者warwickh
相关产品推荐
相关产品推荐

