我有一个数据框,例如:
Predicate<RequestLine> rlPred = this::isDatesNotNull;
rlPred = rlPred.and(p -> p.getServiceStartDate().compareTo(p.getSubscription().getStartDate()) >= 0)
.and(p -> p.getServiceStartDate().compareTo(p.getSubscription().getEndDate()) <= 0);
这里的想法是只将最高值在3到4之间的网上论坛保留或多或少并得到:
Group Col
Grp1 5
Grp1 1
Grp1 1
Grp1 2
Grp1 3
Grp1 3
Grp1 4
Grp2 1
Grp2 1
Grp2 1
Grp3 1
Grp3 2
Grp3 3
Grp4 1
Grp4 3
Grp4 1
Grp4 2
Grp5 3
Grp6 3
Grp1被删除,因为它的最大值是= Group Col
Grp3 1
Grp3 2
Grp3 3
Grp4 1
Grp4 3
Grp4 1
Grp4 2
Grp5 3
Grp6 4
Grp2被删除,因为它的最大值是= 5
保留Grp3、4、5和6,因为它们的最大值是= 2
答案 0 :(得分:1)
将GroupBy.transform
与Series.between
中的boolean indexing
一起过滤:
df1 = df[df.groupby('Group')['Col'].transform('max').between(3,4)]
或者如果只过滤最大的3
或4
组,则使用Series.isin
:
df1 = df[df.groupby('Group')['Col'].transform('max').isin(3,4)]
print (df1)
Group Col
10 Grp3 1
11 Grp3 2
12 Grp3 3
13 Grp4 1
14 Grp4 3
15 Grp4 1
16 Grp4 2
17 Grp5 3
18 Grp6 3
答案 1 :(得分:1)
我们可以将GroupBy.filter
与Series.max
一起使用。
new_df = df.groupby('Group').filter(lambda x: 3<=x.Col.max()<=4)
输出
Group Col
10 Grp3 1
11 Grp3 2
12 Grp3 3
13 Grp4 1
14 Grp4 3
15 Grp4 1
16 Grp4 2
17 Grp5 3
18 Grp6 3