Python中如何实现DataFrame按id分组的自定义差值判断算法
实现方法
可以直接用pandas实现,核心逻辑可以做性能优化,不需要逐一遍历所有差值计算:
- 按
id分组后,判断某个value1是否存在value2 - value1 ≥2,等价于判断同组value2的最大值减去该value1是否≥2:如果最大的value2计算出的差值都不满足阈值,其余更小的value2计算出的差值必然都小于2,用这个逻辑可以大幅提升计算效率。
完整可运行代码如下:
import pandas as pd # 1. 构造原始数据集 df = pd.DataFrame({ "id": ["a1", "a1", "a1", "b1", "b1", "b1", "b1"], "value1": [20, 20, 36, 40, 40, 60, 60], "value2": [25, 37, 25, 63, 42, 42, 63] }) # 2. 给每一行映射对应id分组下的value2最大值 df["group_v2_max"] = df.groupby("id")["value2"].transform("max") # 3. 按(id, value1)去重,计算is_differ标记,整理输出列 result = df[["id", "value1", "group_v2_max"]].drop_duplicates().assign( is_differ = lambda x: (x["group_v2_max"] - x["value1"] >= 2).astype(int) )[["id", "value1", "is_differ"]]
运行后输出结果和需求完全匹配:
id value1 is_differ 0 a1 20 1 2 a1 36 0 3 b1 40 1 5 b1 60 1
如果需要完全贴合题目描述的逐值计算逻辑(不做性能优化,代码可读性更直白),也可以用分组apply的写法,输出结果完全一致:
result = df.groupby("id").apply( lambda group: pd.Series(group["value1"].unique(), name="value1").to_frame().assign( is_differ = lambda x: x["value1"].apply( lambda v1: int((group["value2"] - v1 >= 2).any()) ) ), include_groups=False ).reset_index()[["id", "value1", "is_differ"]]
内容的提问来源于stack exchange,提问作者gh1222
相关产品推荐
相关产品推荐

