pandas中按两列自定义规则去重,保留x列唯一且y值未被占用的行
实现方法
这个需求属于动态规则筛选,无法直接用内置的duplicated类静态方法实现,因为y值的占用状态会随着前面保留的行动态更新,按行遍历处理即可实现,具体如下:
完整代码
import pandas as pd # 构造示例数据 data = [[1,100], [1,101], [1,102], [1,103], [2,102], [2,104], [2,105], [3,102], [3,107]] df = pd.DataFrame(data,columns = ['x', 'y']) # 初始化状态集合与标记列 used_x = set() used_y = set() inc_list = [0] * len(df) # 按行顺序遍历处理 for idx, row in df.iterrows(): current_x = row['x'] current_y = row['y'] # 当前x已经保留过,直接跳过 if current_x in used_x: continue # 当前y未被占用,标记为保留并更新状态 if current_y not in used_y: inc_list[idx] = 1 used_x.add(current_x) used_y.add(current_y) # 写入标记列 df['inc'] = inc_list
输出结果
运行后得到的df和期望结果完全一致:
x y inc 0 1 100 1 1 1 101 0 2 1 102 0 3 1 103 0 4 2 102 1 5 2 104 0 6 2 105 0 7 3 102 0 8 3 107 1
如果需要直接提取所有保留的行,执行df[df['inc'] == 1]即可。
注意事项
该逻辑严格按照DataFrame的原有行顺序处理,如果业务对x、y的匹配优先级有不同要求,先对df做排序调整顺序后再执行上述逻辑即可。
内容的提问来源于stack exchange,提问作者user44796
相关产品推荐
相关产品推荐

