标记每组数据框中的异常值

oly*_*ska 1 python apply pandas pandas-groupby

我想识别数据帧中每组值的异常值,并返回一个数据帧,该数据帧的每一行包含包含 True/False 的列。

data = {'Group':['A', 'A', 'A', 'B', 'B', 'B'], 'Age':[20, 21, 19, 18, 2, 17]} 
df = pd.DataFrame(data) 

def flag_outlier(x):
    lower_limit  = np.mean(x) - np.std(x) * 3 
    upper_limit = np.mean(x) + np.std(x) * 3
    for i in x:
        if i > upper_limit or i < lower_limit:
            return True
df['Flag'] = df.groupby('Group')['Age'].apply(flag_outlier)
Run Code Online (Sandbox Code Playgroud)

此代码返回 NaN 列,如何修复此函数?

这篇文章 将函数应用于 groupby 函数类似,但我无法弄清楚。

非常感谢,

Qua*_*ang 6

您可以使用groupby().transformgetmeanstdby group,然后between查找异常值:

groups = df.groupby('Group')
means = groups.Age.transform('mean')
stds = groups.Age.transform('std')

df['Flag'] = df.Age.between(means-stds*3, means+stds*3)
Run Code Online (Sandbox Code Playgroud)