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

使用Pandas移除伪重复数据:处理id1与id2交换的重复项

嗨,这个需求我之前做项目的时候刚好碰到过!核心思路其实很简单:先把每一行的id1和id2做个「标准化处理」,让它们不管谁在前谁在后,都变成同一个固定的组合,之后再用常规的去重逻辑就行。下面给你一步步演示怎么实现:

第一步:构造示例数据(方便你测试)

先模拟一个符合你需求的DataFrame,包含id互换的重复项:

import pandas as pd

data = [
    ('Joe', 'Jane', 1.2, 'Blue'),
    ('Jane', 'Joe', 1.2, 'Blue'),  # 这行是id互换的重复项
    ('Alice', 'Bob', 3.4, 'Red'),
    ('Bob', 'Alice', 3.4, 'Green'),  # info2不同,不算重复
    ('Charlie', 'Dave', 5.6, 'Yellow')
]
df = pd.DataFrame(data, columns=['id1', 'id2', 'info1', 'info2'])

第二步:生成标准化的ID组合列

我们对每一行的id1和id2进行排序,然后转成元组(元组是可哈希的,能被Pandas的去重函数识别)。这样不管id1和id2怎么互换,得到的组合都是一样的:

# 对id1和id2排序后生成标准键,支持任意可比较的数据类型
df['standardized_ids'] = df.apply(lambda row: tuple(sorted([row['id1'], row['id2']])), axis=1)

如果你的id1和id2存在不可直接比较的类型(比如混合了字符串和数字),可以先把它们转成统一格式再排序,比如转成字符串:

df['standardized_ids'] = df.apply(lambda row: tuple(sorted([str(row['id1']), str(row['id2'])])), axis=1)

第三步:基于标准键+其他列去重

现在我们可以把standardized_ids和info1、info2一起作为去重的判断依据,保留第一次出现的非重复行:

# 去重,keep='first'表示保留第一次出现的行,也可以选'last'或False(删除所有重复)
df_deduped = df.drop_duplicates(subset=['standardized_ids', 'info1', 'info2'], keep='first')

# 删掉临时的standardized_ids列(如果不需要的话)
df_deduped = df_deduped.drop(columns=['standardized_ids'])

最终效果

处理后你会发现,('Joe', 'Jane', 1.2, 'Blue')和('Jane', 'Joe', 1.2, 'Blue')只保留了一行,而('Alice', 'Bob', 3.4, 'Red')和('Bob', 'Alice', 3.4, 'Green')因为info2不同,会被保留下来,完全符合你的需求。

这个方法的好处是灵活,不管id1和id2是字符串、数字、日期甚至自定义类型(只要支持比较),都能正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:04:46