pandas dataframe中如何提取任意顺序的两列唯一配对?
问题描述
需要在pandas DataFrame中实现不区分列顺序的配对去重:只要两个元素分别出现在两列中,不管位置如何调换,都属于同一个配对,仅保留一条记录。
示例输入
col1 col2 a b b a c d d c e d
期望输出
col1 col2 a b c d e d
实现方法
核心逻辑是给每一行生成一个不受两列顺序影响的唯一标识,用这个标识作为去重判断依据即可。
基础实现方案
操作步骤:
- 逐行取出col1、col2的两个元素,按照固定规则(比如字符串字典序)排序后组合成元组,作为临时去重键
- 生成的临时去重键会把
(a,b)和(b,a)识别为同一个值,天然适配“不区分顺序”的匹配要求 - 基于临时去重键删除重复行,保留每个唯一配对的第一条原始记录,最后移除临时键列
对应可运行代码:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'col1': ['a', 'b', 'c', 'd', 'e'], 'col2': ['b', 'a', 'd', 'c', 'd'] }) # 生成不受顺序影响的去重键 df['dedup_key'] = df.apply( lambda x: tuple(sorted([x['col1'], x['col2']])), axis=1 ) # 去重并移除临时列 result = df.drop_duplicates(subset='dedup_key', keep='first').drop(columns='dedup_key')
大数据量优化方案
当DataFrame行数较多时,逐行apply的运行效率偏低,可以用向量化操作生成排序键,减少循环耗时:
import numpy as np # 逐行对两列元素做排序,生成无顺序的配对组合 sorted_pairs = np.sort(df[['col1', 'col2']].values, axis=1) # 取排序后组合的首次出现索引,筛选得到最终结果 result = df.iloc[pd.DataFrame(sorted_pairs).drop_duplicates(keep='first').index]
内容的提问来源于stack exchange,提问作者Ganesh M
相关产品推荐
相关产品推荐

