我的数据框由学生,日期和考试成绩组成。我想找到每个学生的最长日期并返回相应的行(最终,我最感兴趣的是学生最近的分数)。我怎么能在熊猫中做到这一点?
让我们说我的数据框看起来像这样(缩写版):
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
我在SO上发现了这个,但它给了我一个位置索引器越界错误。
df.iloc[df.groupby('student_id').apply(lambda x: x['date'].idxmax())]
实现同样目标的其他方法是什么?
答案 0 :(得分: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