Pandas 获取满足条件的数据帧组

Pandas 获取满足条件的数据帧组,pandas,dataframe,pandas-groupby,Pandas,Dataframe,Pandas Groupby,我有一个数据框架,包括课程、课程、学生id等列 每门课程可以有一个或多个部分,每个部分有一个或多个学生: 课程学生证组 数学。第1条。斯图1 数学。第1条。斯图2 数学。第二。斯图3 物理学。第1条。斯图4 ... 我如何获得以下信息: 1.max学生注册了哪门课程? 2.看看学生人数最多的前两部分,哪门课程的学生人数最多? 我可以获得最大值,但如何获得具有最大值的组 除了使用groupby,还可以使用课程作为索引吗?如果您有这样的数据帧: import pandas as pd import

我有一个数据框架,包括课程、课程、学生id等列 每门课程可以有一个或多个部分,每个部分有一个或多个学生: 课程学生证组 数学。第1条。斯图1 数学。第1条。斯图2 数学。第二。斯图3 物理学。第1条。斯图4 ...

我如何获得以下信息: 1.max学生注册了哪门课程? 2.看看学生人数最多的前两部分,哪门课程的学生人数最多? 我可以获得最大值,但如何获得具有最大值的组


除了使用groupby,还可以使用课程作为索引吗?

如果您有这样的
数据帧:

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
对于第二部分,您需要根据前两个注册人数最多的部分,确定哪门课程的注册人数最多。您可以通过计算截面尺寸,然后将两个最大的截面相加来实现这一点。(拖放副本可确保每个节仅表示一次)


为什么不想使用groupby?使用groupby没有问题。只是好奇是否有其他方法可以得到相同的结果。另一个相关的问题:如何获得组内的平均行。如果没有一个与平均值完全匹配,那就是最近的两个。我会为此提出另一个问题。只需确保包含一个示例输入和您的预期输出。请随意借用我下面的测试
df
,或修改它以更好地适应新问题。非常感谢。第一个正是我想要的。试图理解第二个解决方案。第二个问题有没有更简单的方法。可能需要更多的代码,但没关系。第二部分的第一行只是计算课程中每个部分的大小,并将该值返回到原始数据帧的每一行,以获得适当的部分和课程。然后你需要前两部分的总和。删除重复项使每个部分仅表示一次。(否则,您将两次将顶部添加到一起)。然后按课程分组,并将两个最大值的截面大小值相加。
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