Как рассчитать универсальный в Пандах - PullRequest
0 голосов
/ 22 октября 2018

У меня есть датафрейм, похожий на этот

studentID subjectID subjectMark subjectWeight  Rank   overallScore 

 1         111         100         0.4           3      40      
 1         222         0           0.6           3      40   
 2         111         90          0.4           1      90      
 2         222         90          0.6           1      90     
 3         111         0           0.4           2      60      
 3         222         100         0.6           2      60       

, как вы можете видеть, ученики 1 и 3, каждый из них набрал очень высокий балл по определенным предметам, но их общие баллы плохие, тогда как у студента2 не получил ни одного высшего балла по какому-либо предмету, но имеет лучший общий балл

totalScore = subject111Mark * subject111Weight + subject222Mark * subject222Weight

, поэтому я хочу узнать, является ли определенный студент "всем"-рунд ", что означает, что я хочу видеть, имеет ли этот студент самый высокий общий балл , но не имеет ни одного наивысшего балла по какому-либо предмету.если это условие выполнено, пометьте этого студента как «универсал»

, и df должен выглядеть следующим образом:

studentID subjectID subjectMark subjectWeight  Rank   overallScore AR

 1         111         100         0.4           3      40         F
 1         222         0           0.6           3      40         F
 2         111         90          0.4           1      90         T
 2         222         90          0.6           1      90         T
 3         111         0           0.4           2      60         F
 3         222         100         0.6           2      60         F

У меня есть дополнительный вопрос
данный ответ может помочь в последнем кадре данных, но что, если я хочу сделать это для каждого класса в следующем кадре данных?

studentID subjectID subjectMark subjectWeight  Rank   overallScore classID

 1         111         100         0.4           3      40         1
 1         222         0           0.6           3      40         1
 2         111         90          0.4           1      90         1
 2         222         90          0.6           1      90         1
 3         111         0           0.4           2      60         1
 3         222         100         0.6           2      60         1
 4         444         95          0.4           3      38         2
 4         555         0           0.6           3      38         2
 5         444         90          0.4           1      90         2
 5         555         90          0.6           1      90         2
 6         444         0           0.4           2      57         2
 6         555         95          0.6           2      57         2

Ответы [ 2 ]

0 голосов
/ 22 октября 2018
list_of_all_rounder_per_class = []

for classid in data['classID'].unique():
    that_class = data.loc[data.classID == classID]
    condition1 = that_class.groupby(['subjectID']).subjectMark.transform('max').eq(that_class.subjectMark) 
    condition2 = that_class.overallScore.eq(that_class. overallScore.max()) 
    # get the above conditions and both met should return True
    list_of_all_rounder_per_class.append(condition2 &((~condition1).groupby(that_class['studentID']).transform('all')))

total_result = [result_for_each_class.to_frame('all_rounder') for result_for_each_class in list_of_all_rounder_per_class]
all_rounder = pd.concat(total_result)

data = data.join(all_rounder, how='outer')

Я нашел способ обойти это, хотя это может быть лучший (самый чистый) способ достижения цели

0 голосов
/ 22 октября 2018

Вы можете проверить

s1=df.groupby('subjectID').subjectMark.transform('max').eq(df.subjectMark)# check the max score with each student 
s2=df.overallScore.eq(df.overallScore.max())# get the max score of overall
s2&((~s1).groupby(df['studentID']).transform('all'))# get the above conditions and both met should return True
Out[1066]: 
0    False
1    False
2     True
3     True
4    False
5    False
dtype: bool
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...