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

Pandas使用apply lambda双规则过滤:按前序rank的x/y差和z1.1倍阈值筛选行

Pandas 按前序rank行规则筛选数据实现方案

核心筛选规则

  • 所有rank = 1的行默认全部保留
  • 对rank > 1的行,只要存在任意一个前序更低rank的行同时满足以下三个条件,就删除当前行:
    • x列差值的绝对值≤1
    • y列差值的绝对值≤1
    • 当前行z列值 < 前序行z列值的1.1倍
  • 不满足删除条件的行保留,同时加入对比池供后续更高rank的行做判断

实现代码(apply+lambda写法)

import pandas as pd

# 示例数据构造
df = pd.DataFrame({
    'rank': [1, 1, 2, 2, 3, 3],
    'x': [0, 3, 0, 3, 4, 2],
    'y': [0, 4, 0, 4, 5, 5],
    'z': [1, 3, 1.2, 3.25, 3, 6],
})

# 按rank升序排序,保证前序rank的行优先处理
df_sorted = df.sort_values('rank').reset_index(drop=True)
# 存储已保留的前序行,用于后续行对比
saved_prev = []

def check_row(row):
    if row['rank'] == 1:
        saved_prev.append(row)
        return True
    # 遍历所有前序保留行判断是否触发删除条件
    for p in saved_prev:
        if (abs(row['x'] - p['x']) <=1 
            and abs(row['y'] - p['y']) <=1 
            and row['z'] < p['z'] * 1.1):
            return False
    saved_prev.append(row)
    return True

# apply+lambda筛选行
output = df_sorted[df_sorted.apply(lambda r: check_row(r), axis=1)]
print(output)

输出结果验证

运行上述代码得到的输出和需求一致:

rank  x  y    z
0     1  0  0  1.0
1     1  3  4  3.0
2     2  0  0  1.2
5     3  2  5  6.0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:45:02