Подсчитайте максимальное значение в каждой группе с Пандами

#python #pandas

Вопрос:

Предположим, у меня есть df фрейм данных, выглядящий так

     school   score   student_id
0    1        100.0   965
1    2        64.0    1483
2    2        100.0   1055
3    2        68.0    1806
4    1        100.0    971
 

Я хочу узнать, сколько максимальных баллов в каждой группе, и получить что-то вроде этого:

 school count_max
  1       2
  2       1
 

Как я могу это сделать?

Комментарии:

1. Пожалуйста, добавьте свою испытанную команду в свой вопрос в качестве ваших усилий, что очень поощряется, поэтому, спасибо.

2. Что такое count_max ? Количество строк в группе, где score равно максимальному в группе? Или максимальный общий показатель?

3. Я думаю count_max , что это количество строк в группе, где балл равен максимальному в группе

Ответ №1:

count_max Предполагая , что score столбец равен 100 , вы можете сделать:

 df.loc[df.score==100, 'max_score'] = True
df.max_score.fillna(False, inplace=True)
df.groupby('school')['max_score'].sum()
 

Ответ №2:

1. Для случая maximum score означает общий максимум данных в столбце score

Вы можете получить максимальный балл, .max() а затем score сравнить его с этим максимальным. Затем сгруппируйте school по .groupby() и получите количество записей , соответствующих максимальному GroupBy.sum() значению, следующим образом:

 (df['score'].eq(df['score'].max())
            .groupby(df['school'])
            .sum()
).reset_index(name='count_max')
 

Ввод

(Добавлена еще одна строка для дополнительного тестового случая с нулевым совпадением:)

 print(df)

   school  score  student_id
0       1  100.0         965
1       2   64.0        1483
2       2  100.0        1055
3       2   68.0        1806
4       1  100.0         971
5       3   99.0        2096              <==   Added a row here
 

Результат:

    school  count_max
0       1          2
1       2          1
2       3          0
 

2. Для случая maximum score означает максимум score в пределах группы одного и того же school :

Вы можете использовать .groupby() , agg() , Series.value_counts() , .max() следующим образом:

 (df.groupby('school')['score']
   .agg(lambda x: x.value_counts().loc[x.max()])
   .reset_index(name='count_max')
)
 

Объяснение:

Здесь код x.value_counts().loc[x.max()]) принимает x (переданный .agg() лямбда-функции) как часть ряда столбцов pandas score под каждой группой school . Вызов кода value_counts() для получения количества всех уникальных значений. Его возвращаемый тип-серия pandas, которую мы можем использовать .loc[] , чтобы найти запись x.max() , которая является максимальным значением в группе. Возвращаемым значением будет количество записей с максимальным значением в этой группе.

Выход:

(На основе ввода добавлена еще одна строка выше:)

    school  count_max
0       1          2
1       2          1
2       3          1