如何在DataFrameGroupBy.agg中使用sum(min_count=1)且保持原生sum速度?
高效实现分组聚合时的sum(min_count=1)
场景1:所有目标列都需要sum(min_count=1)
直接调用groupby.sum()并传入参数,完全复用原生向量化逻辑,速度和你最初的聚合操作一致:
df.groupby(…).sum(min_count=1)
场景2:部分列用sum(min_count=1),其他列用不同聚合方式
用functools.partial包装原生的pd.Series.sum,指定min_count=1参数,既保留原生函数的性能,又能灵活搭配其他聚合逻辑:
from functools import partial # 包装出带min_count=1的sum函数 sum_min1 = partial(pd.Series.sum, min_count=1) # 在agg字典中使用 df.groupby(…).agg({ "foo": sum_min1, "bar": "sum", # 普通sum "baz": "mean" # 其他聚合操作 })
为什么之前的方法性能差?
- lambda表达式会触发逐组的Python函数调用,无法利用pandas底层的C优化,导致速度骤降。
- 直接给
agg()传min_count=1时,若agg接收的是字典参数,这些全局kwargs不会传递给每个列的聚合函数,因此不生效。
内容的提问来源于stack exchange,提问作者scravy
相关产品推荐
相关产品推荐

