получить условие встречи группы данных панд - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть датафрейм, скажем, с колонками, как курс, раздел, student_id Каждый курс может иметь один или несколько разделов, каждый раздел - один или несколько студентов: курс . раздел student_id математика сек. stu1 математика сек. STU2 математика сек. stu3 физика сек. stu4 ... ...

Как я могу получить следующее: 1. на какой курс записано максимальное количество студентов? 2. глядя на две верхние секции с большинством студентов, какой курс записал большинство студентов? Я могу получить максимальное значение, но как я могу получить группу с максимальным

Помимо использования groupby, возможно ли сделать это, используя курс в качестве индекса?

1 Ответ

0 голосов
/ 25 апреля 2018

Если у вас есть 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...