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

基于两列组合去除Pandas DataFrame中的特殊重复项

处理Pandas中无序组合的重复项问题

问题场景

当DataFrame中两列的无序组合(如AB和BA)在业务逻辑中被视为重复项时,常规的df.drop_duplicates()无法直接识别并去除这类重复,需要自定义规则实现去重并保留首次出现的行。

初始两列数据集

1  2
0  A  B
1  C  D
2  E  F
3  G  H
4  B  A
5  I  J
6  K  L

期望处理结果

1  2
0  A  B
1  C  D
2  E  F
3  G  H
5  I  J
6  K  L

扩展含数值列的数据集

1  2    3
0  A  B  0.2
1  C  D  0.1
2  E  F  0.0
3  G  H  0.5
4  B  A  0.2
5  I  J  0.3
6  K  L  0.6

解决方案

核心思路是将每一行的两列值排序后生成唯一标识,让AB和BA对应同一个标识,再基于该标识去重。

方法1:生成辅助列去重

适用于需要保留中间步骤的场景:

import pandas as pd

# 构造示例数据(以扩展数据集为例)
data = {
    '1': ['A', 'C', 'E', 'G', 'B', 'I', 'K'],
    '2': ['B', 'D', 'F', 'H', 'A', 'J', 'L'],
    '3': [0.2, 0.1, 0.0, 0.5, 0.2, 0.3, 0.6]
}
df = pd.DataFrame(data)

# 生成排序后的组合标识列
df['sorted_pair'] = df.apply(lambda row: ''.join(sorted([row['1'], row['2']])), axis=1)

# 按标识列去重,保留首次出现的行,最后删除辅助列
result = df.drop_duplicates(subset='sorted_pair', keep='first').drop(columns='sorted_pair')

方法2:分组直接取首行(更简洁)

无需生成辅助列,直接通过分组实现:

import pandas as pd

# 构造示例数据
data = {
    '1': ['A', 'C', 'E', 'G', 'B', 'I', 'K'],
    '2': ['B', 'D', 'F', 'H', 'A', 'J', 'L'],
    '3': [0.2, 0.1, 0.0, 0.5, 0.2, 0.3, 0.6]
}
df = pd.DataFrame(data)

# 按排序后的两列组合分组,取每组第一行并重置索引
result = df.groupby(df.apply(lambda x: tuple(sorted([x['1'], x['2']])), axis=1)).first().reset_index(drop=True)

两种方法最终都会得到符合预期的去重结果,且保留首次出现的行。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 04:45:39