




本文介绍如何使用 `groupby().apply()` 正确实现对多个列同时传入自定义聚合函数(如需基于条件筛选后计算)的场景,解决 `agg()` 中混合内置方法与跨列 lambda 函数导致的 typeerror。
在 Pandas 中,DataFrame.groupby().agg() 方法虽然强大,但其设计初衷是对单列独立应用聚合函数(如 'sum', 'mean'),或通过元组形式指定 (col

正确的解决方案是改用 groupby().apply(),它将每个分组子集(即 pd.DataFrame)完整传递给用户函数,从而天然支持跨列操作、条件过滤和任意复杂逻辑。关键在于:自定义函数必须返回一个 pd.Series(而非标量或字典),以便 Pandas 能自动展开为结果 DataFrame 的列。
以下为推荐实现方式:
def group_fn(g):
return pd.Series({
"Column_A": g["A"].sum(),
"Filtered_Mean": arbFun(g["A"], g["B"]) # 完全复用原有 arbFun,无需修改
})
result = data.groupby(["Label1", "Label2"], as_index=False).apply(group_fn)
print(result)输出结果如下(注意 NaN 自动替代 None,符合 Pandas 空值惯例):
Label1 Label2 Column_A Filtered_Mean 0 1 north 2.0 NaN 1 1 south 18.0 9.0 2 2 north 10.0 4.0 3 2 south 12.0 12.0
✅ 优势说明:
⚠️ 注意事项:
综上,当聚合逻辑涉及多列协同、条件筛选或复杂状态依赖时,groupby().apply() 是比 agg() 更灵活、更可靠的工具。