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

Pandas中如何在MultiIndex二级索引上应用不同聚合函数?

针对MultiIndex二级索引应用不同聚合函数的解决方案

你这个需求在日常处理Pandas数据时挺常见的,咱们可以用几种不同的思路来实现,我给你详细拆解每种方法的逻辑和代码:

首先先明确一个自定义函数的示例(你可以直接替换成自己实际需要的业务逻辑):

def custom_func(x):
    # 示例:计算每组各列的最大值与最小值之差,和sum的输出结构保持一致
    return x.max() - x.min()

方法一:分组后用apply做条件判断

这种方法最直观,先按month和var分组,然后在自定义的apply函数里判断当前组的var取值,选择对应的函数执行:

def apply_by_var(group):
    # 获取当前组的二级索引var的取值
    current_var = group.index.get_level_values('var')[0]
    if current_var == 'v1':
        return group.sum()
    elif current_var == 'v2':
        return custom_func(group)
    # 可选:处理其他未定义的var值,这里默认返回sum
    else:
        return group.sum()

# 应用函数得到最终结果
final_result = df_all_idx.groupby(['month', 'var']).apply(apply_by_var)

方法二:拆分数据分别处理后合并

如果你的自定义函数逻辑比较复杂,拆分数据单独处理会更清晰,调试起来也方便:

# 从MultiIndex中分别提取v1和v2对应的数据
v1_df = df_all_idx.xs('v1', level='var')
v2_df = df_all_idx.xs('v2', level='var')

# 对两组数据分别应用对应的函数
v1_result = v1_df.groupby('month').sum()
v2_result = v2_df.groupby('month').apply(custom_func)

# 重新设置索引,统一格式后合并结果
v1_result = v1_result.reset_index().assign(var='v1').set_index(['month', 'var'])
v2_result = v2_result.reset_index().assign(var='v2').set_index(['month', 'var'])

final_result = pd.concat([v1_result, v2_result]).sort_index()

方法三:利用agg配合规则字典

这种方法代码更紧凑,通过字典直接映射不同var对应的聚合函数,可读性很强:

# 定义规则字典:key是var取值,value是对应的聚合函数
agg_rules = {
    'v1': 'sum',
    'v2': custom_func
}

# 分组后根据当前组的var值选择对应的函数执行
final_result = df_all_idx.groupby(['month', 'var']).agg(
    lambda x: agg_rules[x.name[1]](x)
)

示例输出结果

以自定义函数为「最大值减最小值」为例,最终会得到这样的结果:

M1   M2
month var
1     v1  5.0  7.0
      v2  3.0  3.0
2     v1  4.0  5.0
      v2  0.0  0.0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:17:44