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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:24:27