You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 21:09:03