我有一个数据框,其中列为course,section,student_id 每门课程可以有一个或多个部分,每个部分有一个或多个学生: 当然。部分student_id 数学 。 sec1。 STU1 数学 。 sec1。屋顶盒2 数学 。 sec2。 stu3 物理学。 sec1。 stu4 ... ...
如何获得以下信息: 1.哪个课程有最多的学生注册? 2.与大多数学生一起查看前两部分,哪个课程的学生人数最多? 我能够获得最大值,但是如何获得最大值
的组除了使用groupby之外,是否可以使用该课程作为索引?
答案 0 :(得分:0)
如果你有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
对于第二部分,您想要根据前2个最多注册的部分确定哪个课程的最大注册人数。您可以通过计算截面大小然后将两个最大的部分加在一起来实现此目的。 (删除重复项确保每个部分仅表示一次)
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