我有以下数据框,然后进行计算以识别异常值:
import pandas as pd
#Create DF
d = {
'Day': ['M','M','M','T','T','T','W','W','W','W','W','W','W','F','F','F','F'],
'Criteria':[30,35,2.5,3,6,15,20,1.5,4,25,50,75,2,4,9,2,36]
}
df = pd.DataFrame(data=d)
#Outliers calc
lower_limit = df.Criteria.quantile(.05)
upper_limit = df.Criteria.quantile(.95)
df['Flag'] = df.Criteria.between(lower_limit, upper_limit)
df
您可以看到 Day
W
包含一个异常值(在本例中为 2)。
基本上,如果 Flag
等于 False
,我想删除该 Day
组中的所有行。
所以我的预期结果是从表中删除了所有 'W'
天。提前致谢!
答案 0 :(得分:1)
Groupby.filter
:保留那些 Day
的 Flag
为 True 的 all
组:
>>> df.groupby("Day").filter(lambda d: d.Flag.all())
Day Criteria Flag
0 M 30.0 True
1 M 35.0 True
2 M 2.5 True
3 T 3.0 True
4 T 6.0 True
5 T 15.0 True
13 F 4.0 True
14 F 9.0 True
15 F 2.0 True
16 F 36.0 True
答案 1 :(得分:1)
我认为这就是你想要的:
import numpy as np
df = df[df.groupby('Day').Flag.transform(np.all)]
df
答案 2 :(得分:0)
试试这个应该比filter
out = df[~df.Day.isin(df.loc[~df.Flag,'Day'])]
Out[20]:
Day Criteria Flag
0 M 30.0 True
1 M 35.0 True
2 M 2.5 True
3 T 3.0 True
4 T 6.0 True
5 T 15.0 True
13 F 4.0 True
14 F 9.0 True
15 F 2.0 True
16 F 36.0 True