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

时间:2019-07-29 15:21:51

标签: python pandas apply 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)

此代码返回带有NaN的列,该函数如何固定?

此帖子 apply a function to a groupby function是相似的,但我不知道。

非常感谢,

2 个答案:

答案 0 :(得分:3)

您可以使用groupby().transform按组获取meanstd,然后使用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)

答案 1 :(得分:1)

将功能更改为以下

def flag_outlier(x):
    lower_limit  = np.mean(x) - np.std(x) * 3 
    upper_limit = np.mean(x) + np.std(x) * 3
    return (x>upper_limit)| (x<lower_limit)

因为这样做,您的函数每组仅返回一个值