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

如何在大型销售DataFrame中按品牌分组计算Z-score并识别异常值

按品牌分组计算Z-score并添加到DataFrame

错误原因

你之前的代码无法运行是因为:groupby生成的分组对象不能直接调用stats.zscore,需要通过transform或apply方法对每个分组内的数据单独计算Z-score。

正确实现方式

方法1:使用scipy.stats.zscore(与你原代码逻辑一致)

先确保导入所需库:

import numpy as np
from scipy import stats
import pandas as pd

通过groupby + transform实现分组计算,transform会返回与原DataFrame长度一致的结果,直接赋值即可:

df['z-score'] = df.groupby('brand')['value'].transform(lambda x: stats.zscore(x))

方法2:手动计算Z-score(避免依赖scipy,适合大数据量场景)

如果不想依赖scipy,可以用pandas内置的均值和标准差计算,注意设置ddof=0以匹配stats.zscore的总体标准差逻辑:

df['z-score'] = df.groupby('brand')['value'].transform(lambda x: (x - x.mean()) / x.std(ddof=0))

标记异常值

计算完Z-score后,可直接标记每个品牌下的异常值(通常以|Z-score|>3为阈值):

df['is_outlier'] = np.abs(df['z-score']) > 3

针对大数据量的优化建议

由于你的DataFrame是数GB级,建议:

  • 尽量避免使用apply(逐行处理效率低),优先用transform
  • 如果内存紧张,可以考虑分块处理品牌,或使用Dask等大数据处理库

内容的提问来源于stack exchange,提问作者Maksim .Levin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:50:40