如何在大型销售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
相关产品推荐
相关产品推荐

