如何在Pandas DataFrame中按Ref提取最后n组快照行?
解决方法
首先要明确核心需求:为每个唯一的Ref值,保留对应时间最新的n个快照(每个快照是同一Time点的若干行)。你的代码问题出在分组维度错误,下面是正确实现步骤:
步骤1:确保时间列是datetime类型
如果Time列是字符串格式,首先要转换为datetime类型,否则排序逻辑会出错:
import pandas as pd # 转换时间列(匹配你的时间格式) df['Time'] = pd.to_datetime(df['Time'], format='%d/%m/%Y %H:%M:%S')
步骤2:高效筛选每个Ref的最后n个快照
推荐用rank方法给每个Ref下的快照按时间排序,然后筛选排名前n的快照行:
n = 3 # 要保留的快照数量 # 为每个Ref下的每个Time分配排名(时间越新排名越小) # method='dense'确保同一时间的快照共享同一个排名 df['snapshot_rank'] = df.groupby('Ref')['Time'].rank(method='dense', ascending=False) # 筛选排名<=n的所有行,即每个Ref的最后n个快照 filtered_df = df[df['snapshot_rank'] <= n].drop('snapshot_rank', axis=1)
为什么你的原代码不对?
你之前的groupby(['Time', 'Ref', 'TestId'])是按时间+Ref+TestId三个维度分组,tail(3)只会取每个细分小组的最后3行,这和你要保留「每个Ref的最后n个时间快照」的需求完全不匹配。正确的分组维度应该是仅按Ref,然后在组内处理时间快照的筛选。
性能说明
这个方法针对百万级数据效率很高:groupby+rank是Pandas的内置优化操作,不会产生额外的内存开销,比手动遍历分组更高效。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

