如何获取 pandas 中 groupby() 中的最后一条记录?

YGA*_*YGA 4 python pandas

我有一个数据框df,其中包含每个学生的许多记录。我经常想获得具有最后时间戳的那个。

做这个的最好方式是什么?以前我一直在使用last(),但这给出了最后一个非空值,而实际上我只想要最后一个值,空值或其他值。

使用apply(lambda r: r.iloc[-1])有效,但代码感觉很丑(我讨厌使用 anapply并且据说它感觉缓慢且低效,可能是因为 apply)。

这样做的正确方法是什么?

(Pdb) df = pd.DataFrame([["A",2,3],["B",5,6],["A",np.NaN,4]], columns=["student", "value_a", "timestamp"]).sort_values("timestamp")
(Pdb) df
  student  value_a  timestamp
0       A      2.0          3
2       A      NaN          4
1       B      5.0          6

(Pdb) df.groupby("student").last()
# This gives the wrong answer
         value_a  timestamp
student                    
A            2.0          4
B            5.0          6

(Pdb) df.groupby("student").apply(lambda r: r.iloc[-1])
# This gives the right answer but feels inefficient
        student  value_a  timestamp
student                            
A             A      NaN          4
B             B      5.0          6
Run Code Online (Sandbox Code Playgroud)

moz*_*way 5

一种选择是使用groupby.tail

df.groupby('student').tail(1)
Run Code Online (Sandbox Code Playgroud)

输出:

  student  value_a  timestamp
2       A      NaN          4
1       B      5.0          6
Run Code Online (Sandbox Code Playgroud)

请注意,如果您想要最后一个时间戳,另一个选项是使用以下索引groupby.idxmax

df.loc[df.groupby('student')['timestamp'].idxmax()]
Run Code Online (Sandbox Code Playgroud)