pandas groupby后对不同分组应用不同函数并合并结果的实现方案
解决方案
方案1:向量化掩码匹配(最高效,推荐)
该方案无groupby额外开销,所有运算均为向量化执行,数万行数据可毫秒级完成,适合自定义函数支持传入Series批量计算的场景。
首先构造分组名称到对应计算函数的映射字典,再逐类匹配计算即可:
import pandas as pd from io import StringIO # 初始数据生成代码 df_str = """ ValOption RB 0 SLA 4 1 AC 5 2 SLA 5 3 PG 5 4 SLA 5 5 PC 4 6 SLA 4 """ df = pd.read_csv(StringIO(df_str.strip()), sep='\s+') # 自定义业务函数 def sla_func(df): return df['RB']*3+df['RB'] def ac_func(df): return df['RB']/4*df['RB']+1 def pg_func(df): return df['RB']-5 # 1. 构造分组-函数映射字典,后续新增分组只需修改该字典 func_map = { 'SLA': sla_func, 'AC': ac_func, 'PG': pg_func } # 2. 初始化新列,按分组匹配计算 df['group_v'] = pd.NA # 未匹配分组默认设为缺失值,可自行修改默认值 for opt, func in func_map.items(): mask = df['ValOption'] == opt df.loc[mask, 'group_v'] = func(df[mask])
方案2:groupby 分组匹配(更通用)
如果自定义函数需要依赖分组的全局属性(如分组内均值、排序结果等),可以用groupby结合组名匹配函数的方式实现:
# 接上述初始代码和func_map定义 df['group_v'] = df.groupby('ValOption', group_keys=False).apply( lambda g: func_map[g.name](g) if g.name in func_map else pd.NA )
结果验证
运行代码后输出和预期完全匹配:
ValOption RB group_v 0 SLA 4 16.00 1 AC 5 7.25 2 SLA 5 20.00 3 PG 5 0.00 4 SLA 5 20.00 5 PC 4 <NA> 6 SLA 4 16.00
如果需要处理PC这类未匹配的分组,只需在func_map中新增对应处理函数,或者修改默认返回值即可。
内容的提问来源于stack exchange,提问作者William
相关产品推荐
相关产品推荐

