如何为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
相关产品推荐
相关产品推荐

