基于两列组合去除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
相关产品推荐
相关产品推荐

