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
相关产品推荐
相关产品推荐

