我有一个数据框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)
一种选择是使用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)
| 归档时间: |
|
| 查看次数: |
59 次 |
| 最近记录: |