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

