基于3倍标准差在pandas DataFrame中标记异常值并新增列
实现方案
3倍标准差异常判定规则为:当数值落在[分组均值 - 3*分组标准差, 分组均值 + 3*分组标准差]区间外时,判定为异常值。
你可以借助pandas的分组+transform方法实现需求,完整代码如下:
import pandas as pd # 构造示例数据 data = {'Group':['A', 'A', 'A'], 'Age':[18, 200, 17]} df = pd.DataFrame(data) # 定义3倍标准差异常判定函数 def flag_outlier(series): mean_val = series.mean() std_val = series.std() # 超出区间返回True,否则返回False return ~series.between(mean_val - 3 * std_val, mean_val + 3 * std_val) # 按Group分组计算,生成布尔类型Outlier列 df['Outlier'] = df.groupby('Group')['Age'].transform(flag_outlier) # 若需要得到字符串格式的True/False,可替换为下面这行 # df['Outlier'] = df.groupby('Group')['Age'].transform(flag_outlier).astype(str)
补充说明
你提供的示例数据中,单组A的3倍标准差区间约为[-237.8, 394.4],200仍在区间内,按照严格3倍标准差规则不会被判定为异常。如果需要和你给出的示例输出完全一致,可以调整为1.5倍四分位距判定规则,实现代码如下:
def flag_outlier_iqr(series): q1 = series.quantile(0.25) q3 = series.quantile(0.75) iqr = q3 - q1 return ~series.between(q1 - 1.5 * iqr, q3 + 1.5 * iqr) df['Outlier'] = df.groupby('Group')['Age'].transform(flag_outlier_iqr).astype(str)
内容的提问来源于stack exchange,提问作者Anakin Skywalker
相关产品推荐
相关产品推荐

