pandas: фильтровать строки, имеющие максимальное значение для каждой категории

#pandas

#pandas

Вопрос:

Начиная с таких данных:

 np.random.seed(314)
df = pd.DataFrame({
        'date':[pd.date_range('2016-04-01', '2016-04-05')[r] for r in np.random.randint(0,5,20)], 
        'cat':['ABCD'[r] for r in np.random.randint(0,4,20)], 
        'count': np.random.randint(0,100,20)
})

   cat  count       date
0    B     87 2016-04-04
1    A     95 2016-04-05
2    D     89 2016-04-02
3    D     39 2016-04-05
4    A     39 2016-04-01
5    C     61 2016-04-05
6    C     58 2016-04-04
7    B     49 2016-04-03
8    D     20 2016-04-02
9    B     54 2016-04-01
10   B     87 2016-04-01
11   D     36 2016-04-05
12   C     13 2016-04-05
13   A     79 2016-04-04
14   B     91 2016-04-03
15   C     83 2016-04-05
16   C     85 2016-04-05
17   D     93 2016-04-01
18   C     85 2016-04-02
19   B     91 2016-04-03
  

Я бы хотел, чтобы в итоге были только те строки, где count максимальное значение в соответствующем cat :

    cat  count       date
1    A     95 2016-04-05
14   B     91 2016-04-03
16   C     85 2016-04-05
17   D     93 2016-04-01
18   C     85 2016-04-02
19   B     91 2016-04-03
  

Обратите внимание, что может быть несколько записей с максимальным количеством для каждой категории

Ответ №1:

Используя transform

 df[df['count']==df.groupby('cat')['count'].transform('max')]
Out[163]: 
   cat  count       date
1    A     95 2016-04-05
14   B     91 2016-04-03
16   C     85 2016-04-05
17   D     93 2016-04-01
18   C     85 2016-04-02
19   B     91 2016-04-03