当最高值达到或超过熊猫阈值时保持分组

时间:2020-01-14 08:22:31

标签: python pandas

我有一个数据框,例如:

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

2 个答案:

答案 0 :(得分:1)

GroupBy.transformSeries.between中的boolean indexing一起过滤:

df1 = df[df.groupby('Group')['Col'].transform('max').between(3,4)]

或者如果只过滤最大的34组,则使用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.filterSeries.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