如何在Pandas中添加无排列重复的三元组至DataFrame?
处理Pandas DataFrame中三元组去重(排列视为重复)的问题
问题背景
现有空DataFrame df(列名:['id', 'a', 'b', 'c']),以及三元组列表 L = [(1,2,3), (2,5,4), (2,5,4), (3,2,0), (2,1,3)]。需要按以下约束将三元组添加到df中:
- 三元组的任意排列视为同一组,重复(含排列重复)的项不能添加;
id为已添加项的递增计数器,从0开始。
最终期望输出:
id a b c 0 1 2 3 1 2 5 4 2 3 2 0
解决方案
方法一:集合+标准化过滤(高效优雅首选)
核心思路是将每个三元组标准化(排序后转为元组),用集合记录已出现的标准化结果,遍历原列表时过滤重复项,最后生成DataFrame。这种方法时间复杂度为O(n),逻辑简洁且高效:
import pandas as pd L = [(1,2,3), (2,5,4), (2,5,4), (3,2,0), (2,1,3)] seen = set() unique_triples = [] for triple in L: # 排序后转元组,让排列相同的三元组生成唯一key normalized = tuple(sorted(triple)) if normalized not in seen: seen.add(normalized) unique_triples.append(triple) # 生成DataFrame并添加id列 df = pd.DataFrame(unique_triples, columns=['a', 'b', 'c']) df.insert(0, 'id', range(len(df))) print(df)
方法二:Pandas内置去重(适合已加载到DataFrame的场景)
如果已经将所有三元组导入DataFrame,可通过生成标准化列实现去重:
import pandas as pd L = [(1,2,3), (2,5,4), (2,5,4), (3,2,0), (2,1,3)] df = pd.DataFrame(L, columns=['a', 'b', 'c']) # 为每行生成标准化标识(排序后的元组) df['normalized'] = df.apply(lambda row: tuple(sorted(row)), axis=1) # 按标准化列去重,保留首次出现的行 df = df.drop_duplicates(subset='normalized', keep='first').drop(columns='normalized') # 添加递增id列 df.insert(0, 'id', range(len(df))) print(df)
两种方法对比
- 方法一:遍历+集合查找的效率更高,尤其适合大数据量场景,同时保留了原列表中三元组的首次出现顺序;
- 方法二:更贴合Pandas的操作习惯,但
apply逐行处理的效率略低,适合数据已在DataFrame中的情况。
内容的提问来源于stack exchange,提问作者M. Fire
相关产品推荐
相关产品推荐

