You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:36:19