如果不同的列满足熊猫中的条件,如何从组中删除所有行

时间:2021-06-12 13:29:48

标签: python pandas

我有以下数据框,然后进行计算以识别异常值:

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

enter image description here

您可以看到 Day W 包含一个异常值(在本例中为 2)。

基本上,如果 Flag 等于 False,我想删除该 Day 组中的所有行。

所以我的预期结果是从表中删除了所有 'W' 天。提前致谢!

3 个答案:

答案 0 :(得分:1)

Groupby.filter:保留那些 DayFlag 为 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