我想为数据框内的每组值识别异常值,并返回一个数据框,该列的每一行都包含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是相似的,但我不知道。
非常感谢,
答案 0 :(得分:3)
您可以使用groupby().transform
按组获取mean
和std
,然后使用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)
因为这样做,您的函数每组仅返回一个值