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

