You need to enable JavaScript to run this app. Pandas DataFrame 如何基于指定列仅保留每组最后一条记录
优惠活动
大模型
产品
解决方案
定价
更多

Pandas DataFrame 如何基于指定列仅保留每组最后一条记录

对应实现方案

核心逻辑无需依赖「重复记录必须相邻」的假设,用pandas内置API即可100%适配数据场景,不管重测记录间隔多少其他行,都能精准拿到每个(TEST_NUM, SITE_NUM)分组的最新记录。

快速实现可接受兼容结果

如果已经将全部原始行解析为完整DataFrame,仅需1行核心代码即可完成筛选:

# 按 TEST_NUM、SITE_NUM 分组,保留每个分组在原始DataFrame中的最后一条记录
last_group_records = df.groupby(["TEST_NUM", "SITE_NUM"], as_index=False).tail(1)

该操作会严格按照原始行的先后顺序识别组内元素的新旧,不受同一分组记录间隔距离的影响——哪怕SITE_NUM=1的重测记录排在SITE_NUM=2、3的测试行之后,也能正确被识别为该组的最新值。
直接运行这行代码得到的输出顺序,就是定义的「可接受兼容结果」,不需要额外处理。

实现理想顺序的优化操作

如果需要严格按照SITE_NUM从0到3的顺序排列输出,仅需在上述结果基础上加1行排序逻辑,无额外复杂度:

# 按 TEST_NUM、SITE_NUM 升序排列,对齐站点0→1→2→3的顺序要求
ideal_result = last_group_records.sort_values(
    by=["TEST_NUM", "SITE_NUM"],
    ascending=[True, True]
).reset_index(drop=True)

运行后得到的输出和示例中的「预期理想结果」完全一致。

适配逐行解析场景的鲁棒方案

如果是逐行从文本文件读取数据,不想等全部读完再做分组处理,可以用字典覆盖的逻辑替代原有的「相邻old值判断」方案,鲁棒性更强:

record_dict = {}
# 逐行解析文本流
for line in file_handle:
    current_row = parse_single_line(line)  # 原有行解析逻辑
    # 分组键为(TEST_NUM, SITE_NUM),读到对应键的新行时直接覆盖字典内的旧值
    group_key = (current_row["TEST_NUM"], current_row["SITE_NUM"])
    record_dict[group_key] = current_row
# 全部行解析完成后,将字典中的值转为最终DataFrame
final_df = pd.DataFrame(record_dict.values())
# 如需理想顺序,仍可通过上述sort_values逻辑完成排序

该逻辑不需要判断当前行和上一行的site、test_num是否匹配,不管重测记录间隔多少行,只要键值相同就直接覆盖为最新记录,从根源上解决了原有方案的场景不匹配问题。


内容的提问来源于stack exchange,提问作者Kartik Mehra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 18:54:03