Python Pandas 多分组场景跨列应用多自定义函数的实现方法
完整实现方案
核心逻辑是通过分组对象的列子集筛选 + apply 传入指定列对,完全适配现有自定义函数的入参定义,不需要修改f1/f2/f3的内部代码,可灵活切换任意列组合。
针对g1(按A列分组)的计算
- 将f1应用于B、C两列:
g1[['B', 'C']].apply(lambda group: f1(group['B'], group['C']))
输出结果参考:
A a 13 b 32 dtype: int64
- 将f2应用于C、D两列:
g1[['C', 'D']].apply(lambda group: f2(group['C'], group['D']))
输出结果参考:
A a -9 b -16 dtype: int64
针对g2(按P列分组)的计算
- 将f2应用于B、C两列:
g2[['B', 'C']].apply(lambda group: f2(group['B'], group['C']))
输出结果参考:
P p -9 q -6 dtype: int64
- 将f3应用于C、D两列:
g2[['C', 'D']].apply(lambda group: f3(group['C'], group['D']))
输出结果参考(f3为逐元素运算,返回和原组形状一致的结果):
C 0 36 1 60 2 55 3 84 4 104
灵活适配任意列组合的原理
同一函数复用到不同列对时,只需要调整两个位置:
- 筛选分组子集的列:比如g2要给f2传C、D列,就把
g2[['B','C']]改成g2[['C','D']] - 调整lambda里传给函数的入参顺序:对应匹配函数要求的参数位置传入
group中对应的列序列即可
全程不需要修改原有自定义函数的代码逻辑,完全匹配多列入参的要求。
常见避坑点
- 不要直接使用
agg方法传入多列自定义函数:agg默认接收单列序列作为入参,无法直接传递跨列的两个值给自定义函数,会触发参数数量不匹配的报错。 - 区分函数的运算粒度:如果自定义函数是聚合类逻辑(比如f1/f2的先求和再运算),apply会返回每个分组的单值结果,自动携带分组索引;如果是逐元素运算(比如f3的列元素相乘),apply会返回和原分组形状一致的明细结果。
内容的提问来源于stack exchange,提问作者Iterator516
相关产品推荐
相关产品推荐

