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

