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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:06:39