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

MS Access新手提问:如何计算分组数据的Standard Deviation并自动填充列

解决方案

以下提供3种不同场景下的实现方式,均可以直接生成组内统计量并自动匹配到对应行:

方法1:Excel/Google Sheets(适合小体量数据,无需写复杂脚本)

不需要手动拆分赛事分组,直接用分组条件函数完成计算,公式下拉即可自动填充所有行:

  • 组均值列公式:=AVERAGEIF(赛事ID列范围, 本行赛事ID, SPD列范围),例:赛事ID在A列、SPD在C列、首行数据在第2行,公式为=AVERAGEIF(A:A, A2, C:C)
  • 组标准差列公式:=STDEV.S(IF(A:A=A2, C:C)),Excel中需按Ctrl+Shift+Enter作为数组公式输入,Google Sheets可直接输入
  • 组内Z值列公式:=IF(组标准差单元格=0, 0, (SPD单元格 - 组均值单元格)/组标准差单元格),加判断是为了避免单场赛事所有赛马SPD值一致时出现除以0的报错

提示:数据量超过10万行时,建议计算完成后把公式列转成数值存储,避免表格卡顿

方法2:Python(Pandas,适合大数据量、后续对接ML流程)

用groupby做分组变换,直接生成三列新数据并自动对齐原始数据顺序:

import pandas as pd

# 假设df为你的原始数据框,race_id为赛事ID列名,spd为速度评分列名
# 一次性生成三个新列
df[['race_mean', 'race_std', 'spd_z_score']] = df.groupby('race_id')['spd'].transform(
    lambda x: pd.Series([x.mean(), x.std(ddof=1), (x - x.mean())/x.std(ddof=1) if x.std(ddof=1)!=0 else 0])
)

# 如需将三个新列移到SPD列右侧,可加以下代码调整列顺序
spd_idx = df.columns.get_loc('spd')
cols = df.columns.tolist()
new_cols = cols[:spd_idx+1] + ['race_mean', 'race_std', 'spd_z_score'] + cols[spd_idx+1:-3]
df = df[new_cols]

方法3:R(适合统计分析场景)

用dplyr的分组操作即可实现:

library(dplyr)

df <- df %>%
  group_by(race_id) %>%
  mutate(
    race_mean = mean(spd, na.rm = T),
    race_std = sd(spd, na.rm = T),
    spd_z_score = ifelse(race_std == 0, 0, (spd - race_mean)/race_std)
  ) %>%
  ungroup()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:06:03