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
相关产品推荐
相关产品推荐

