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

在DataFrameGroupBy中选择MultiIndex类型多列的问题

解决MultiIndex列DataFrame分组聚合时选择多个第一层级列的问题

问题描述

我有一个列是MultiIndex类型的DataFrame,使用.groupby计算指标时,能完成两类基础操作:

  • 对整个DataFrame执行聚合
  • 对指定单列(第一层级)执行聚合

但我希望针对列第一层级中的部分名称执行聚合操作,编写了最小可复现示例(MRE),但尝试的几种方法均报错:

import numpy as np
import pandas as pd


columns = pd.MultiIndex.from_tuples(
    [
        ("Dimensions", "x"),
        ("Dimensions", "y"),
        ("Dimensions", "z"),
        ("Coefficient", ""),
        ("Comments", ""),
    ],
    names=["Category", "Details"],
)

df = pd.DataFrame(index=range(11), columns=columns)
df[("Dimensions", "x")] = np.random.randint(1, 100, size=11)
df[("Dimensions", "y")] = np.random.randint(1, 100, size=11)
df[("Dimensions", "z")] = np.random.randint(1, 100, size=11)
df[("Coefficient", "")] = np.random.randint(1, 50, size=11)  # Coefficient como entero aleatorio
df[("Comments", "")] = np.random.choice(["Good", "Average", "Bad"], size=11)
df["Comments"] = df["Comments"].astype("category")

# Basic metrics
print(df.groupby("Comments").mean())  # 正常运行
print(df.groupby("Comments")["Dimensions"].mean())  # 正常运行

# 尝试选择MultiIndex中多个第一层级列的几种错误方法:
df.groupby("Comments")["Dimensions", "Coefficient"].mean()  # 报错
df.groupby("Comments")[["Dimensions", "Coefficient"]].mean()  # 报错
df.groupby("Comments").agg({"Dimensions": "mean", "Coefficient": "mean"})  # 报错

错误原因说明

之前尝试的方法报错核心在于MultiIndex列的选择逻辑和单层索引完全不同:

  • 直接用逗号分隔或单层列表的字符串,无法匹配MultiIndex的第一层级列
  • agg方法中直接使用第一层级名称作为键,会被识别为不存在的单层列名

正确解决方案

方法1:筛选指定第一层级的列后聚合

先通过get_level_values筛选出第一层级为目标值的列,再传入groupby进行聚合:

# 定义要聚合的第一层级列名
target_levels = ["Dimensions", "Coefficient"]
# 筛选符合条件的列
selected_cols = df.columns[df.columns.get_level_values("Category").isin(target_levels)]
# 执行分组聚合
result = df.groupby("Comments")[selected_cols].mean()
print(result)

方法2:使用pd.IndexSlice简洁选择MultiIndex列

利用pd.IndexSlice可以更直观地对MultiIndex列进行切片选择:

idx = pd.IndexSlice
# 选择第一层级为Dimensions/Coefficient的所有子列
result = df.groupby("Comments")[idx[target_levels, :]].mean()
print(result)

方法3:修正agg方法的参数格式

如果要使用agg,需要指定完整的列元组,或者用嵌套字典批量处理第一层级列:

# 方式A:明确指定每个子列的聚合函数
agg_dict = {
    ("Dimensions", "x"): "mean",
    ("Dimensions", "y"): "mean",
    ("Dimensions", "z"): "mean",
    ("Coefficient", ""): "mean"
}
result = df.groupby("Comments").agg(agg_dict)
print(result)

# 方式B:嵌套字典批量处理第一层级列(自动筛选数值型子列)
from pandas.core.dtypes.common import is_numeric_dtype

result = df.groupby("Comments").agg({
    level: {col: "mean" for col in df[level].columns if is_numeric_dtype(df[level][col])}
    for level in target_levels
})
print(result)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 04:27:29