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

如何基于查找表高效计算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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:30:02