#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