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

如何使用Pandas的groupby实现多维度分组下的自定义均方值聚合

如何使用Pandas的groupby实现多维度分组下的自定义均方值聚合

没问题,这个需求完全可以用Pandas的groupby优雅实现,根本不用写繁琐的循环,效率还更高!我来一步步给你理清楚怎么操作。

首先回顾下你的核心需求:按day、cat1、cat2三个维度分组,对每个分组内的value列计算先平方再取均值的均方值,最后得到包含所有分组组合的长格式DataFrame。

先说说你之前代码的小问题

你尝试的这段代码:

data.groupby(["day", "cat1", "cat2"])["value"].apply(lambda x: x**2).mean()

逻辑顺序错了——apply(lambda x: x**2)会先把每个分组的value都平方,得到一个包含所有分组平方后数据的Series,然后.mean()是对整个Series求全局均值,而不是每个分组内部的均值,所以结果不符合预期。

正确的实现方式

我们要让“平方+均值”的计算在每个分组内部完成,用agg或者直接在apply里完成完整逻辑都可以,推荐用agg更直观:

方法1:使用lambda表达式快速实现

import pandas as pd
import numpy as np

# 你的原始数据
data = pd.DataFrame({
    "day": [0,0,0,0,0,0,1,1,1,1,1,1], 
    "cat1": ["A", "A", "A", "B", "B", "B", "A", "A", "B", "B", "B", "B"], 
    "cat2":["1", "1", "2", "1", "2", "2", "1", "2", "1", "1", "2", "2"], 
    "value": [10, 230, 32,12, 12, 65, 12, 34, 97, 0, 12,1]
})

# 核心代码
result = data.groupby(["day", "cat1", "cat2"])["value"].agg(lambda x: (x**2).mean()).reset_index()
print(result)

方法2:自定义函数提升可读性(适合复杂逻辑)

如果之后需要修改计算逻辑,用自定义函数会更清晰:

def mean_of_squares(column):
    # 对输入的列先平方再求均值
    return (column ** 2).mean()

result = data.groupby(["day", "cat1", "cat2"])["value"].agg(mean_of_squares).reset_index()

输出结果

运行后会得到你想要的完整DataFrame:

day cat1 cat2    value
0    0    A    1  26500.0
1    0    A    2   1024.0
2    0    B    1    144.0
3    0    B    2   2312.5
4    1    A    1    144.0
5    1    A    2   1156.0
6    1    B    1   4704.5
7    1    B    2     72.5

关键知识点解释

  • groupby(["day", "cat1", "cat2"]):按照你指定的三个维度分组,把所有相同(day, cat1, cat2)组合的行归为一个小组
  • agg(...):对每个分组执行自定义的聚合操作,这里就是完成“平方+均值”的计算
  • reset_index():把groupby生成的索引(三个分组列)转换为普通DataFrame列,还原成你需要的长格式结构

这样就完美实现了你的需求,比循环高效多了,尤其是数据量大的时候优势更明显!

备注:内容来源于stack exchange,提问作者math

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 16:14:36