计算z-score时如何仅用分组内units_sold的负值计算均值与标准差
代码修改方案
你只需要在计算均值、标准差前,先筛选当前分组内的负值数据参与统计即可,修改后的实现如下:
简化写法(直接修改lambda)
zscore = lambda x: (x - x[x < 0].mean()) / x[x < 0].std() df['zscore'] = df['units_sold'].groupby(df['Product_ID']).transform(zscore)
兼容边界情况的完整写法
如果存在部分分组没有负值、或者负值数量不足2个(无法计算有效标准差)的场景,可以用自定义函数处理异常:
import pandas as pd import numpy as np def zscore_negative_only(x): # 提取分组内的负值数据 neg_data = x[x < 0] # 负值样本量不足时返回空值,也可根据业务需求修改为其他默认值 if len(neg_data) < 2: return pd.Series([np.nan] * len(x), index=x.index) # 仅用负值计算均值和标准差 neg_mean = neg_data.mean() neg_std = neg_data.std() return (x - neg_mean) / neg_std # 分组计算zscore df['zscore'] = df['units_sold'].groupby(df['Product_ID']).transform(zscore_negative_only)
逻辑说明:上述两种写法都是仅用分组内的负值统计均值和标准差,但最终会为分组内的每一行(无论该行units_sold是正还是负)计算对应的z-score值。
内容的提问来源于stack exchange,提问作者AmanArora
相关产品推荐
相关产品推荐

