Из Pandas Dataframe возвращают определенные значения столбцов на основе группировки и наибольших значений других столбцов - PullRequest
0 голосов
/ 19 апреля 2019

Учитывая следующий код:

# Import pandas library 
import pandas as pd 


# Data to lists. 
 data = [{'Student': 'Eric', 'Grade': 96, 'Class':'A'}, \
{'Student': 'Caden', 'Grade': 92, 'Class':'A'}, \
{'Student': 'Sam', 'Grade': 90, 'Class':'A'}, \
{'Student': 'Leon', 'Grade': 88, 'Class':'A'}, \
{'Student': 'Laura', 'Grade': 80, 'Class':'B'}, \
{'Student': 'Leann', 'Grade': 22, 'Class':'B'}, \
{'Student': 'Glen', 'Grade': 9, 'Class':'C'}, \
{'Student': 'Jack', 'Grade': 90, 'Class':'C'}, \
{'Student': 'Jill', 'Grade': 87, 'Class':'C'}, \
{'Student': 'Joe', 'Grade': 58, 'Class':'C'}, \
{'Student': 'Andrew', 'Grade': 48, 'Class':'D'}, \
{'Student': 'Travis', 'Grade': 39, 'Class':'E'}, \
{'Student': 'Henry', 'Grade': 23, 'Class':'E'}, \
{'Student': 'Chris', 'Grade': 19, 'Class':'E'}, \
{'Student': 'Jim', 'Grade': 1, 'Class':'E'}, \
{'Student': 'Sarah', 'Grade': 93, 'Class':'E'}, \
{'Student': 'Brit', 'Grade': 92, 'Class':'E'}, \
] 

# Creates DataFrame. 
 df = pd.DataFrame(data) 

 print(df.groupby('Class')['Grade'].nlargest(2))

Из фрейма данных я хотел бы вернуть имена учеников с двумя старшими оценками из каждого класса.Я хотел бы вернуть две разные версии результатов.

Версия 1 будет иметь все исходные столбцы:

enter image description here

ИВерсия 2 будет возвращать только имена:

enter image description here

Вывод (предпочтительнее иметь две вышеупомянутые версии):

enter image description here

Ответы [ 2 ]

2 голосов
/ 19 апреля 2019

IIUC, вы можете sort_values, затем применить head к вашему groupby объекту

df_new = df.sort_values(['Class', 'Grade'], ascending=[True, False]).groupby('Class').head(2)

[вне]

  Class  Grade Student
0      A     96    Eric
1      A     92   Caden
4      B     80   Laura
5      B     22   Leann
7      C     90    Jack
8      C     87    Jill
10     D     48  Andrew
15     E     93   Sarah
16     E     92    Brit

Если вам нужно отфильтровать выходные данные версии 2, просто используйте:

df_new[['Student']]

   Student
0     Eric
1    Caden
4    Laura
5    Leann
7     Jack
8     Jill
10  Andrew
15   Sarah
16    Brit
1 голос
/ 19 апреля 2019

Другой вариант, дублирующий ваш процесс:

df.loc[df.groupby('Class')['Grade'].nlargest(2).index.get_level_values(1)]

   Class  Grade Student
0      A     96    Eric
1      A     92   Caden
4      B     80   Laura
5      B     22   Leann
7      C     90    Jack
8      C     87    Jill
10     D     48  Andrew
15     E     93   Sarah
16     E     92    Brit
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...