我需要基于city
的值来删除分组district
和pct
行,说如果我想删除pct
是否超出阈值-100
或100
。
例如,我们可以看到a
和d
组的pct
值-627.44
小于-100
,因此我们删除了所有{{ 1}}和a
行。同样,我们可以看到d
和b
的值为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
答案 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