You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将带可变参数的自定义聚合函数以Lambda形式用于Pandas Groupby

解决方案:将带参数的自定义函数以Lambda形式集成到Pandas聚合中

没问题!要把你这个带可配置参数的percentile_func用lambda的方式整合到agg方法里,其实只需要用lambda做个“中转”,把分组数据和你想要的参数一起传给自定义函数就行。

基础实现(直接用lambda)

直接在agg的列表里加入lambda,调用你的percentile_func并指定参数:

from sklearn.datasets import load_boston
import pandas as pd
import numpy as np

bunch = load_boston()
y = bunch.target
X = pd.DataFrame(bunch.data, columns=bunch.feature_names)

def percentile_func(y, PERCENTILE=50):
    return np.percentile(y, PERCENTILE)

# 用lambda传递参数,这里用默认的50分位数,也可以改成其他数值比如90
agg_result = X.groupby('CHAS')['CRIM'].agg([
    lambda x: percentile_func(x, PERCENTILE=50),
    'sum',
    'count'
])

print(agg_result)

优化:给聚合结果设置清晰的列名

上面的代码里,lambda对应的列名会显示为<lambda>,可读性不好,我们可以用字典形式agg参数,给每个聚合操作指定自定义列名:

agg_result_named = X.groupby('CHAS')['CRIM'].agg({
    '50th_percentile': lambda x: percentile_func(x, PERCENTILE=50),
    'total_crim_sum': 'sum',
    'record_count': 'count'
})

print(agg_result_named)

原理说明

lambda在这里的作用就是作为一个“适配器”:pandas的agg方法会把每个分组的数据集(也就是代码里的x)自动传给lambda,然后我们在lambda里把这个数据集加上自定义的PERCENTILE参数一起传给percentile_func,这样就完美实现了带参数的自定义聚合。

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

火山引擎 最新活动