You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 19:15:34