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

带MultiIndex列的DataFrame按level=1计算列最值的实现方法

解决方案

1. 构造示例数据

首先还原你的MultiIndex DataFrame:

import pandas as pd

# 构建二级列索引
cols = pd.MultiIndex.from_tuples(
    [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')],
    names=['level=1', 'level=0']
)
# 构建数据
df = pd.DataFrame(
    [[1, 2, 3, 1], [2, 5, 6, 4], [85, 74, 5, 92]],
    columns=cols
)

2. 实现方法

要按level=1的列分组,计算每组(列1、列2)下所有元素的全局最小值和最大值,并匹配原列结构,可按以下步骤操作:

方法一:直接分组聚合并扩展列结构

# 按level=1列分组,计算每组的min和max
grouped_stats = df.groupby(level='level=1', axis=1).agg(['min', 'max'])

# 转换结构:将统计指标转为行,恢复原MultiIndex列结构
result = grouped_stats.unstack().unstack(level=0).T.sort_index(level=1)

# 调整索引名称,匹配你的期望格式
result.index.names = [None]

执行后得到的结果如下:

level=1    1       2    
level=0    a  b    a  b
min        1  1    1  1
max       85 85   92 92

方法二:按需求只保留每组min/max的单个显示(匹配你给出的示例格式)

如果你希望每个level=1组的min/max只显示一次(如示例中min行仅列1的a显示1、列2的b显示1),可以在聚合后手动调整值的显示位置:

# 计算每组的全局min和max
group_min = df.groupby(level='level=1', axis=1).min().min()
group_max = df.groupby(level='level=1', axis=1).max().max()

# 构造空结果DataFrame,匹配原列结构
result = pd.DataFrame(index=['min', 'max'], columns=df.columns)

# 填充对应位置的值
result.loc['min', (1, 'a')] = group_min[1]
result.loc['min', (2, 'b')] = group_min[2]
result.loc['max', (1, 'a')] = group_max[1]
result.loc['max', (2, 'b')] = group_max[2]

得到的结果与你给出的示例一致:

level=1    1       2    
level=0    a    b    a    b
min        1  NaN  NaN    1
max       85  NaN  NaN   92

核心思路

  • 利用groupby(level='level=1', axis=1)按二级列索引的上层分组,实现对列1、列2各自子列的批量处理;
  • 通过agg方法聚合min和max,再通过unstack/stack调整数据结构,匹配期望的输出格式;
  • 若需要自定义显示位置,可先计算聚合值,再手动填充到目标列位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 01:27:48