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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:36:06