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

