解决此问题的另一种方法是在groupby上使用聚合,然后在完整数据帧上进行选择.
df.iloc[df.groupby('id')['date'].idxmax()]
这似乎比您提出的解决方案快5-10倍(见下文).请注意,这仅在’date’列是数字而不是字符串类型时才有效,并且此转换还可以加快基于排序的解决方案:
# Timing your original solutions:
%timeit df.groupby('id').apply(lambda t: t[t.date==t.date.max()])
# 1 loops, best of 3: 826 ms per loop
%timeit df.reindex(df.sort_values(["date"], ascending=False)["id"].drop_duplicates().index)
# 100 loops, best of 3: 5.1 ms per loop
# convert the date
df['date'] = pd.to_datetime(df['date'])
# new times on your solutions
%timeit df.groupby('id').apply(lambda t: t[t.date==t.date.max()])
# 1 loops, best of 3: 815 ms per loop
%timeit df.reindex(df.sort_values(["date"], ascending=False)["id"].drop_duplicates().index)
# 1000 loops, best of 3: 1.99 ms per loop
# my aggregation solution
%timeit df.iloc[df.groupby('id')['date'].idxmax()]
# 10 loops, best of 3: 135 ms per loop