如何将带可变参数的自定义聚合函数以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




