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

如何为Pandas按列分组的GroupBy对象应用不同聚合规则?

实现不同分组的自定义聚合函数

当然有内置方法可以搞定这个需求!Pandas的GroupBy.agg()方法正好支持给不同分组指定不同的聚合逻辑,完全匹配你的场景。

完整代码示例

先还原你的数据和分组,然后直接用agg()实现:

import pandas as pd
import numpy as np

# 构造你的原始DataFrame
df = pd.DataFrame(
    [[2, 10.0, 0, 11], [5, np.nan, np.nan, 8]],
    index=['one', 'two'],
    columns=['B', 'C', 'D', 'E']
)

# 按列分组
groups = np.array(['min', 'max', 'min', 'max'])
grouped = df.groupby(groups, axis=1)

# 给不同分组应用对应聚合函数
result = grouped.agg({
    'min': lambda col: col.sum(axis=1),  # 默认skipna=True,自动忽略NaN
    'max': lambda col: col.sum(axis=1, skipna=False)  # 保留NaN,只要有一个NaN结果就是NaN
})

print(result)

输出结果

min   max
one     2  21.0
two     5   NaN

完全符合你的期望!

原理说明

  • GroupBy.agg()接受一个字典参数,键是分组的名称(这里是'min'和'max'),值是要应用到该分组的聚合函数。
  • 我们用lambda函数直接封装sum()的不同参数:min组用默认的skipna=True(求和时忽略NaN),max组强制skipna=False(只要分组内有NaN,求和结果就是NaN)。
  • 如果你的聚合逻辑更复杂,也可以提前定义函数再传入,比如:
def sum_with_skipna(col):
    return col.sum(axis=1)

def sum_without_skipna(col):
    return col.sum(axis=1, skipna=False)

result = grouped.agg({'min': sum_with_skipna, 'max': sum_without_skipna})

这样代码可读性会更好。

内容的提问来源于stack exchange,提问作者Credics

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 20:02:56