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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:30:58