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

基于Pandas向量化实现分组排除当前组的标准差计算

Pandas向量化实现排除当前组后的标准差计算

当处理百万级行数据时,用apply逐行计算同group内排除当前team的value标准差会慢到离谱,下面用统计量推导的方式实现全向量化计算,彻底摆脱逐行循环的低效。

首先给出修正语法后的示例数据:

import pandas as pd
df = pd.DataFrame({
    'group': ['A','A','A','A','A','A','B','B','B','B','B','B'],
    'team': ['1','1','2','2','3','3','1','1','2','2','3','3'],
    'value': [1,2,5,7,2,3,7,8,8,9,6,4]
})

实现步骤

1. 计算每个(group, team)的核心统计量

先按group+team分组,算出每个小组的value总和、平方和、样本数量:

team_stats = df.groupby(['group', 'team']).agg(
    sum_val=('value', 'sum'),
    sum_sq=('value', lambda x: (x**2).sum()),
    count=('value', 'count')
).reset_index()

2. 计算每个group的整体统计量

再单独按group分组,算出整个group的总总和、总平方和、总样本数:

group_stats = df.groupby('group').agg(
    total_sum=('value', 'sum'),
    total_sq=('value', lambda x: (x**2).sum()),
    total_count=('value', 'count')
).reset_index()

3. 合并统计量并推导目标标准差

把两组统计数据合并到原数据中,通过整体统计量减去当前team的统计量,得到排除当前team后的统计值,再用样本标准差公式计算结果:

# 合并统计数据到原表
merged = df.merge(team_stats, on=['group', 'team'], how='left')
merged = merged.merge(group_stats, on='group', how='left')

# 计算排除当前team后的统计量
merged['excl_sum'] = merged['total_sum'] - merged['sum_val']
merged['excl_sq'] = merged['total_sq'] - merged['sum_sq']
merged['excl_count'] = merged['total_count'] - merged['count']

# 计算样本标准差(当剩余样本数<2时,标准差无意义,设为NaN)
merged['std_exclude'] = merged.apply(
    lambda row: ((row['excl_sq'] - (row['excl_sum']**2)/row['excl_count']) / (row['excl_count'] - 1))**0.5 
    if row['excl_count'] >= 2 else float('nan'),
    axis=1
)

# 提取最终结果
result = merged[['group', 'team', 'value', 'std_exclude']]

效果验证

以group A的team 1为例,排除后对应的value是[5,7,2,3],手动计算样本标准差约为2.217,和代码输出结果完全一致。这种方法全程使用Pandas的向量化分组聚合,仅最后一步是简单的逐行公式计算,相比原apply方法,速度提升几个数量级,完全适配百万级数据量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:35:18