Python:DataFrame内计算均值并保留原有多层索引
保留多层索引计算DataFrame均值的解决方案
当然可以!完全能在计算均值的同时保留你原有的多层索引——核心就是用pandas的groupby结合level参数,指定要保留的索引层级即可。下面给你具体的实现方法和示例,匹配你的需求:
先明确场景(示例数据)
假设你的dfx多层索引包含分组维度(比如group1、group2对应你说的x1、y1)和时间索引,结构大概是这样:
import pandas as pd import numpy as np # 构造模拟数据,还原你的多层索引场景 arrays = [ ['x1', 'x1', 'x1', 'x2', 'x2', 'x2'], ['y1', 'y1', 'y2', 'y1', 'y2', 'y2'], pd.date_range('2024-01-01', periods=3).tolist() + pd.date_range('2024-01-01', periods=3).tolist() ] dfx = pd.DataFrame( {'value': np.random.randn(6)}, index=pd.MultiIndex.from_arrays(arrays, names=['group1', 'group2', 'timestamp']) )
方法1:生成分组均值汇总表(保留分组索引)
如果你想要的是每个分组(比如x1-y1、x1-y2这类组合)对应的均值结果,直接按分组索引层级groupby后计算均值:
# 按group1和group2分组,计算时间维度上的均值 mean_summary = dfx.groupby(level=['group1', 'group2']).mean()
执行后mean_summary的索引就是你要保留的group1和group2,每一行对应一个分组的均值,完全符合你要的x1、y1等对应均值的输出需求。
如果不想硬编码层级名称,也可以用索引位置来指定(比如时间是最后一层,就保留除最后一层外的所有层级):
# 动态获取除最后一层(时间)外的所有索引层级 mean_summary = dfx.groupby(level=list(range(dfx.index.nlevels - 1))).mean()
方法2:在原DataFrame中保留全索引并新增均值列
如果需要完整保留原有的所有多层索引(包括时间戳),同时给每一行添加上对应分组的均值,那就用transform方法:
# 新增group_mean列,每个分组的均值会填充到该分组的每一行 dfx['group_mean'] = dfx.groupby(level=['group1', 'group2'])['value'].transform('mean')
这样原DataFrame的所有索引(包括时间)都不会变,每行都能看到自己所属分组的均值。
这两种方法都能精准匹配你的需求,你可以根据实际的输出形式选择~
内容的提问来源于stack exchange,提问作者Gabriel_Koch
相关产品推荐
相关产品推荐

