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

