如何从上到下移除两非分组列中的重复项(逐行校验)
行级校验的DataFrame去重实现
问题场景
给定如下示例DataFrame,需对x、y两列进行行级去重校验:
import pandas as pd df = pd.DataFrame({ 'x': ['A', 'B', 'B', 'B', 'C', 'D'], 'y': ['BB', 'BB', 'AA', 'CC', 'DD', 'CC'], 'z': [8, 7.5, 6.2, 5, 4, 3] }, index=[1,2,3,4,5,6])
需求规则:逐行校验x、y列,只要任意一列的值在之前的行中出现过,就删除当前行。最终期望保留的结果为:
x y z 1 A BB 8.0 3 B AA 6.2 5 C DD 4.0 6 D CC 3.0
高效实现方案
针对大数据集,可通过集合跟踪已出现值的方式实现行级过滤,避免分组或单列处理导致的过度删除:
# 初始化集合,记录已出现的x、y值 seen_x = set() seen_y = set() # 定义行过滤逻辑 def filter_row(row): # 检查当前行的x或y是否已出现过 if row['x'] in seen_x or row['y'] in seen_y: return False # 未出现过则加入集合,保留该行 seen_x.add(row['x']) seen_y.add(row['y']) return True # 应用过滤得到结果 result_df = df[df.apply(filter_row, axis=1)]
逻辑说明
- 用两个独立集合分别跟踪
x和y列已出现的值,确保逐行校验的顺序性 - 每一行仅在
x和y均为首次出现时才被保留,严格符合需求中的行级校验规则 - 该方法时间复杂度为O(n),适合处理大规模数据集
内容的提问来源于stack exchange,提问作者PureLemon
相关产品推荐
相关产品推荐

