如何基于查找表高效计算Pandas多级列的分组均值
Pandas两级列索引分组均值高效实现方案
核心思路是将宽表的多层列索引转为长表维度,通过矢量化分组聚合代替手动循环,数据量越大性能优势越突出。
实现步骤
- 先构建ch编号到分组的映射表,匹配
dict_ref的分组规则 - 拆解二级列名,提取
ch和b两个独立维度,无b后缀的统一设为自定义默认值 - 将原宽表stack为长表格式,批量映射ch所属分组
- 按「原行索引、一级分类、b分类、ch分组」四个维度聚合均值
- 聚合结果转回宽表格式,直接拼接回原DataFrame即可
示例代码
import pandas as pd # 1. 构建ch到分组的映射 ch_group_map = {} for group_name, ch_list in dict_ref.items(): for ch in ch_list: ch_group_map[ch] = group_name # 2. 二级列名拆解函数 def split_second_col(col_name: str): parts = col_name.split("_", maxsplit=1) if len(parts) == 1: return parts[0], "no_b_suffix" return parts[0], parts[1] # 3. 宽表转长表处理 # 把两级列索引都转成行维度 df_long = df.stack(level=[0, 1], future_stack=True).to_frame("val") df_long = df_long.reset_index(level=[1, 2]).rename( columns={"level_1": "first_level", "level_2": "second_col"} ) # 4. 提取ch、b和对应分组 df_long[["ch", "b"]] = pd.DataFrame( df_long["second_col"].apply(split_second_col).tolist(), index=df_long.index ) df_long["ch_group"] = df_long["ch"].map(ch_group_map) # 过滤掉不在分组规则内的ch(如ch5未在dict_ref定义的话自动排除) df_long = df_long.dropna(subset=["ch_group"]) # 5. 分组聚合求均值 group_mean = df_long.groupby( [df_long.index, "first_level", "b", "ch_group"] )["val"].mean().unstack(level=[1, 2, 3]) # 6. 处理新列名,拼接回原表 group_mean.columns = pd.MultiIndex.from_tuples( [(first_lv, f"{ch_group}_avg_{b}") for first_lv, b, ch_group in group_mean.columns] ) df_result = pd.concat([df, group_mean], axis=1)
注意事项
- 如果你的两级列索引顺序相反,只需要调整
stack的level参数对应一级分类的层级即可 - 无b后缀的列的默认标识可根据需求修改
split_second_col函数的返回值
内容的提问来源于stack exchange,提问作者rpb
相关产品推荐
相关产品推荐

