Если у вас есть DataFrame
, как это:
import pandas as pd
import numpy as np
df = pd.DataFrame({'course': ['A','A','A','A','A','A','B','B', 'C'],
'section': [1,1,1,2,3,3,1,2, 1],
'student_id': ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'aaa', 'aaa', 'fff', 'ggg']})
course section student_id
0 A 1 aaa
1 A 1 bbb
2 A 1 ccc
3 A 2 ddd
4 A 3 eee
5 A 3 aaa
6 B 1 aaa
7 B 2 fff
8 C 1 ggg
Затем вы можете пройти курс с максимальным количеством студентов:
df.groupby('course').size().idxmax()
#'A'
df.groupby('course').student_id.nunique().idxmax()
#'A'
В первом методе, если студент зачислен в несколько разделов одного и того же курса, они учитываются дважды. Во втором методе это не так, поэтому используйте тот метод, который наиболее подходит
df.groupby('course').size()
#course
#A 6
#B 2
#C 1
#dtype: int64
df.groupby('course').student_id.nunique()
#course
#A 5
#B 2
#C 1
#Name: student_id, dtype: int64
Для возможности связей не используйте idxmax, а вместо этого посмотрите, где вычисляемая вещь равна максимальному значению:
class_size = df.groupby('course').size()
class_size[class_size==class_size.max()]
#course
#A 6
#dtype: int64
Во второй части вы хотите выяснить, какой курс имеет максимальную регистрацию, основываясь на двух самых популярных разделах. Вы можете сделать это, рассчитав размер раздела, а затем сложив вместе два самых больших раздела. (Удаление дубликатов гарантирует, что каждый раздел представлен только один раз)
df['sec_size'] = df.groupby(['course', 'section']).transform(np.size)
(df.drop_duplicates(['course', 'section'])
.groupby('course').apply(lambda group: group.sec_size.nlargest(2).sum()))
#course
#A 5
#B 2
#C 1
#dtype: int64