2017-07-07 23 views
0

我的数据框由学生,日期和测试分数组成。我想找到每个学生的最大日期并返回相应的行(最终,我最感兴趣的是学生最近的分数)。我怎么能在熊猫身上做到这一点?Groupby最大值并返回熊猫数据框中的对应行

比方说,我的数据框看起来像这样(简化版本):

Student_id Date  Score 
Tina1  1/17/17 .95 
John2  1/18/17 .8 
Lia1  12/13/16 .845 
John2  1/25/17 .975 
Tina1  1/1/17 .78 
Lia1  6/12/16 .89 

这就是我想要的:

Student_id Date  Score 
Tina1  1/17/17 .95 
Lia1  12/13/16 .845 
John2  1/25/17 .975 

我发现这对左右,但它给了我一个位置索引出边界错误。

df.iloc[df.groupby('student_id').apply(lambda x: x['date'].idxmax())] 

什么是其他方法来实现同样的事情?

回答

2

您可以按日期排序的数据帧,然后使用groupby.tail得到最新记录:

df.iloc[pd.to_datetime(df.Date, format='%m/%d/%y').argsort()].groupby('Student_id').tail(1) 

#Student_id  Date Score 
#2  Lia1 12/13/16 0.845 
#0 Tina1 1/17/17 0.950 
#3 John2 1/25/17 0.975 

或避免排序,使用idxmax(这个作品,如果你没有复制指数):

df.loc[pd.to_datetime(df.Date, format='%m/%d/%y').groupby(df.Student_id).idxmax()] 

# Student_id  Date Score 
#3  John2 1/25/17 0.975 
#2  Lia1 12/13/16 0.845 
#0  Tina1 1/17/17 0.950