如何在Pandas DataFrame中高效分组获取最大/最小时间戳
高效实现Pandas按ID分组求时间戳的最大/最小值
嗨,针对你遇到的分组求时间戳极值效率低的问题,我给你推荐一个更高效的解决方案,比你当前用的sort_values+drop_duplicates方法性能提升很多,尤其是在数据集较大的时候。
问题分析
你当前的方法需要先对全表的时间戳排序,再去重保留首尾记录,这种方式的时间复杂度是O(n log n)(因为排序的开销),当数据量很大时,效率会显著下降。而我们可以直接利用Pandas的分组聚合功能,只对每个分组计算极值,时间复杂度是O(n),性能更优。
高效实现代码
首先确保你的timestamp列是datetime类型(如果还没转换的话,这一步很重要,否则字符串类型的极值计算会出错),然后用groupby结合agg直接计算每个分组的最大和最小时间戳:
import pandas as pd # 构造你的示例数据 df = pd.DataFrame({ 'id': [1, 2, 1, 1, 2], 'timestamp': [ '2017-09-17 10:09:01', '2017-10-02 01:13:15', '2017-09-17 10:53:07', '2017-09-17 10:52:18', '2017-09-12 21:59:40' ] }) # 转换timestamp为datetime类型(如果你的原始数据还没做这一步) df['timestamp'] = pd.to_datetime(df['timestamp']) # 核心分组聚合操作 result = df.groupby('id')['timestamp'].agg(['max', 'min']).reset_index() # 输出结果 print(result)
输出结果
运行后你会得到和期望一致的结果:
id max min 0 1 2017-09-17 10:53:07 2017-09-17 10:09:01 1 2 2017-10-02 01:13:15 2017-09-12 21:59:40
额外性能优化
如果你的数据集非常大,还可以尝试加上sort=False参数(默认groupby会对分组键排序),跳过分组键排序的步骤,进一步提升性能:
result = df.groupby('id', sort=False)['timestamp'].agg(['max', 'min']).reset_index()
内容的提问来源于stack exchange,提问作者Nabih Bawazir
相关产品推荐
相关产品推荐

