Pandas按timestamp分组取最小distance时如何保留对应name列
解决方案
你要的需求可以通过groupby().idxmin()一步实现,不需要额外做关联,70万行数据可以秒级处理,完全不会有性能问题。
实现逻辑
idxmin()会返回每个分组里distance列最小值对应的原DataFrame行索引,直接用这个索引从原表取对应行的字段即可,不会产生额外的关联开销。
示例代码
# 按timestamp分组,取每个分组中distance最小的行的索引 min_idx = df1.groupby('timestamp')['distance'].idxmin() # 根据索引取对应行的指定字段,得到最终结果 result = df1.loc[min_idx, ['timestamp', 'name', 'distance']].reset_index(drop=True)
注意事项
- 如果同一个
timestamp下存在多行完全相同的最小distance,idxmin()只会返回第一行的索引,符合你要求的timestamp唯一的需求 - 该方法的时间复杂度为O(n),远低于merge操作的复杂度,70万行数据内存占用极低
原有方案的性能问题原因
你之前用聚合结果和原表merge的方案,需要做两次大表的字段匹配,若存在同分组下多个相同最小distance的行,还会产生冗余数据导致timestamp重复,同时内存开销会翻倍,自然会出现性能不足的问题。
内容的提问来源于stack exchange,提问作者Aleksander Kuś
相关产品推荐
相关产品推荐

