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

pandas如何筛选与前一行差值≤5的行且每行仅参与一次配对

解决方案

方法1:纯pandas向量化实现(无额外依赖,性能最优)

核心逻辑:先筛选出差值符合要求的行,再排除掉前一行已经被选中为配对行的记录,保证每行仅参与一次配对。
实现代码:

import pandas as pd

# 构造示例数据集
df = pd.DataFrame({
    'ID': [1,2,3,4,5],
    'value': [10,15,18,30,35]
})

# 核心逻辑
diff_mask = df['value'].diff().le(5)
final_mask = diff_mask & ~diff_mask.shift(1, fill_value=False)
result = df[final_mask]

运行后result输出结果:

ID  value
1   2     15
4   5     35

完全符合需求。

方法2:numba编译实现(千万级以上超大数据集更优)

如果你的数据集规模极大,可使用numba把循环逻辑编译为机器码,性能比纯pandas操作更高,避免pandas系列运算的额外开销:

import pandas as pd
import numpy as np
from numba import jit

# 编译过滤函数
@jit(nopython=True)
def filter_single_pair(arr):
    n = len(arr)
    mask = np.zeros(n, dtype=np.bool_)
    prev_idx = 0
    for i in range(1, n):
        if arr[i] - arr[prev_idx] <= 5:
            mask[i] = True
            # 配对成功,跳过当前行作为后续配对基准
            prev_idx = i + 1
        else:
            prev_idx = i
    return mask

# 调用函数过滤
result = df[filter_single_pair(df['value'].values)]

两种方法均不需要写Python原生for循环,性能远高于迭代遍历DataFrame的实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:09:02