如何在Python的多层索引DataFrame中新增二级列作为同组二级列的均值?
实现方法
首先构造示例DataFrame(方便复现):
import pandas as pd df = pd.DataFrame( [[1,2,3,4], [1,2,3,4]], index=['aaa', 'bbb'], columns=pd.MultiIndex.from_tuples([('bar', 'one'), ('bar', 'two'), ('baz', 'one'), ('baz', 'two')]) )
方法一:分组计算+合并排序
利用groupby按一级列分组计算均值,再合并回原DataFrame并排序列:
# 计算每个一级分组的列均值 mean_df = df.groupby(axis=1, level=0).mean() # 将均值列转换为多级索引格式 mean_df.columns = pd.MultiIndex.from_tuples([(col, 'mean') for col in mean_df.columns]) # 合并原数据与均值列,按一级列排序保证分组内列顺序 result = pd.concat([df, mean_df], axis=1).sort_index(axis=1, level=0)
方法二:遍历一级列插入均值
逐个处理每个一级分组,计算并插入均值列:
# 获取所有唯一的一级列名 level0_names = df.columns.get_level_values(0).unique() for name in level0_names: # 计算当前一级分组下所有二级列的行均值 mean_vals = df[name].mean(axis=1) # 添加新的均值列,索引为(一级列名, 'mean') df[(name, 'mean')] = mean_vals # 按一级列排序,让每个分组的列(one、two、mean)排列在一起 df = df.sort_index(axis=1, level=0)
两种方法最终都会得到预期结果:
bar baz one two mean one two mean aaa 1 2 1.5 3 4 3.5 bbb 1 2 1.5 3 4 3.5
内容的提问来源于stack exchange,提问作者Fredrik
相关产品推荐
相关产品推荐

