You need to enable JavaScript to run this app. Pandas按合同与日期分组求Difference列最大值打标并保留全量行
优惠活动
大模型
产品
解决方案
定价
更多

Pandas按合同与日期分组求Difference列最大值打标并保留全量行

全量保留原始行的分组最大值标记实现方案

核心实现逻辑

  • 避开会过滤行的聚合类操作,依靠分组广播能力把组内计算值逐行映射回原始表,整个过程不做任何行裁剪
  • 按照contract number、ref_date两个字段作为分组维度,计算每个分组下Difference列的最大值
  • 逐行判断当前行的Difference值是否等于所属分组的最大值,匹配的行赋值标记"x",其余行保持原始内容不变

具体代码实现

首先导入pandas并构造符合场景的测试数据:

import pandas as pd

# 原始测试数据
df = pd.DataFrame({
    "contract number": [1, 1, 1, 2, 2],
    "ref_date": ["2021-02-28", "2021-02-28", "2021-02-29", "2021-02-28", "2021-02-28"],
    "Difference": [1, 3, -2, 2, 5]
})

执行无行丢失的标记计算:

# 分组计算组内Difference最大值,transform返回和原表等长的结果,逐行对应所属分组值
group_diff_max = df.groupby(["contract number", "ref_date"])["Difference"].transform("max")

# 初始化标记列,仅对匹配组内最大值的行赋值"x"
df["mark"] = ""
df.loc[df["Difference"] == group_diff_max, "mark"] = "x"

结果校验

执行完代码后,所有原始行均完整保留:

  • 例如contract=1、ref_date=2021-02-29、Difference=-2的行,会原样留在结果中,不会被过滤
  • 对应contract=1、ref_date=2021-02-28的分组下,Difference=3的行,会被打上"x"标记

常见踩坑说明

之前出现行丢失的问题,通常是因为使用了聚合后取子集、内连接、直接筛选的写法——这类操作会裁剪掉不满足匹配条件的原始行,必须借助transform的等长返回特性,才能在不改动原始行结构的前提下完成标记计算。

内容的提问来源于stack exchange,提问作者aarij khatib

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 20:06:04