如果不满足条件,则删除组中的所有行

时间:2019-12-17 01:51:37

标签: python pandas group-by pandas-groupby

我需要基于city的值来删除分组districtpct行,说如果我想删除pct是否超出阈值-100100

例如,我们可以看到ad组的pct-627.44小于-100,因此我们删除了所有{{ 1}}和a行。同样,我们可以看到db的值为e pct,因此我们也将其删除。

139.77

所需的输出将如下所示。我怎样才能做到这一点?谢谢。

  city district     date  price     pct
0    a        d  2020-01   2.42  -32.06
1    a        d  2020-02   1.43  -41.07
2    a        d  2020-03   0.27  -81.19
3    a        d  2020-04  -1.42 -627.44   # fail, drop all "a"
4    b        e  2020-03   2.14  -21.71
5    b        e  2020-04   1.14  -46.91   
6    b        e  2020-05  -0.45  139.77   # fail, drop all "b"
7    c        f  2020-04   4.59  -22.26
8    c        f  2020-05   2.33  -49.13

2 个答案:

答案 0 :(得分:2)

或者我们可以使用GroupBy.filter

df.groupby(['city','district']).filter(lambda x: (x['pct'].between(-100,100)).all()) 

输出

  city district     date  price    pct
0    c        f  2020-04   4.59 -22.26
1    c        f  2020-05   2.33 -49.13

答案 1 :(得分:1)

创建一个布尔条件,并使用GroupBy.transform将其广播到每个组的所有行中:

df[(df['pct'].between(-100, 100)).groupby(df['city']).transform('all')] 

  city district     date  price    pct
7    c        f  2020-04   4.59 -22.26
8    c        f  2020-05   2.33 -49.13

transform的结果将告诉您哪些组满足此条件:

(df['pct'].between(-100, 100)).groupby(df['city']).transform('all')

0    False
1    False
2    False
3    False
4    False
5    False
6    False
7     True
8     True
Name: pct, dtype: bool

然后您将使用它来过滤df。


(df.loc[(df['pct'].between(-100, 100)).groupby(df['city']).transform('all')] 
   .reset_index(drop=True))

  city district     date  price    pct
0    c        f  2020-04   4.59 -22.26
1    c        f  2020-05   2.33 -49.13