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

如何用Pandas的groupby高效一次性获取DataFrame的均值和标准误?

一次性用Pandas GroupBy计算均值和标准误的高效方案

嘿,这个需求完全可以通过Pandas的groupby.agg()方法一次性搞定,不用分开计算均值和标准误,既节省代码量又提升效率——毕竟重复分组遍历数据会浪费资源嘛!

核心思路

标准误(SEM)的计算公式是标准差除以样本量的平方根,我们可以先定义一个计算SEM的函数,然后结合agg()方法,在一次分组操作中同时指定要计算的均值和SEM。

具体实现代码

import pandas as pd

# 你的示例数据
df = pd.DataFrame({
    'case':[1, 1, 2, 2, 3, 3], 
    'condition':[1,2,1,2,1,2], 
    'var_a':[0.92, 0.88, 0.90, 0.79, 0.94, 0.85], 
    'var_b':[0.21, 0.15, 0.1, 0.16, 0.17, 0.23]
})

# 定义计算标准误的函数
def calculate_sem(x):
    return x.std() / len(x)**0.5

# 一次性分组计算均值和标准误
grouped_result = df.groupby('case', as_index=False).agg(
    # 为每个变量指定要计算的统计量,自定义列名更清晰
    var_a_mean=('var_a', 'mean'),
    var_a_sem=('var_a', calculate_sem),
    var_b_mean=('var_b', 'mean'),
    var_b_sem=('var_b', calculate_sem)
)

print(grouped_result)

运行后会得到这样的结果:

case  var_a_mean  var_a_sem  var_b_mean  var_b_sem
0     1        0.90   0.020000        0.18   0.030000
1     2        0.845  0.055000        0.13   0.030000
2     3        0.895  0.045000        0.20   0.030000

批量处理所有数值列的简化写法

如果你的数据里有很多数值列,不想逐个指定,可以用字典来批量配置统计量:

# 定义要计算的统计量字典
aggregation_config = {
    col: ['mean', calculate_sem] for col in df.columns if col not in ['case', 'condition']
}

# 执行分组聚合
grouped_result = df.groupby('case').agg(aggregation_config).reset_index()

# 重命名多层列,让结果更易读
grouped_result.columns = [
    'case' if col[0] == 'case' else f"{col[0]}_{col[1]}" 
    for col in grouped_result.columns
]

这样不管有多少数值列,都能自动批量计算均值和SEM,非常省心!

可选:用SciPy的现成SEM函数

如果你已经安装了scipy,也可以直接用scipy.stats.sem代替自定义函数,代码会更短:

from scipy.stats import sem

grouped_result = df.groupby('case', as_index=False).agg(
    var_a_mean=('var_a', 'mean'),
    var_a_sem=('var_a', sem),
    var_b_mean=('var_b', 'mean'),
    var_b_sem=('var_b', sem)
)

这个方法和自定义函数的结果是一致的,看你个人习惯选择就行。

内容的提问来源于stack exchange,提问作者fffrost

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:23:50