如何用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
相关产品推荐
相关产品推荐

