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

寻求pd.DataFrame.drop_duplicates()的无序类比高效实现方案

刚好之前处理过类似的需求,尤其是在面对海量数据集的groupby场景时,高效性确实是核心考量点。下面针对你的需求给出两种高效实现方案,优先推荐性能最优的向量化方案:

忽略列顺序的高效去重方案

核心思路是先让"顺序不同但元素相同"的行变成完全一致的形式,再用原生的drop_duplicates逻辑处理,避免逐行循环带来的性能损耗。

方法1:Numpy向量化排序(性能最优)

直接操作底层Numpy数组进行行内排序,这是处理大数据最快的方式——完全没有Python层面的循环,全部是C级别的向量化运算:

import pandas as pd
import numpy as np

# 你的测试数据
df = pd.DataFrame([['a', 'b'], ['c', 'd'], ['a', 'b'], ['b', 'a']])

# 对每一行的元素进行排序(向量化操作,速度极快)
sorted_rows = np.sort(df.values, axis=1)
# 基于排序后的结果生成唯一行的索引
unique_indices = pd.DataFrame(sorted_rows).drop_duplicates().index
# 提取原数据中的唯一行
result = df.loc[unique_indices]

运行后得到的结果完全符合预期:

0  1
0  a  b
1  c  d

方法2:自定义无序哈希标识(代码更直观)

如果你的数据列数不多,或者想更清晰地表达"无序重复"的逻辑,可以用frozenset将每行转成不可变集合(集合不考虑元素顺序),再生成哈希值作为去重依据:

# 给每行生成一个唯一的无序哈希键
df['unique_key'] = df.apply(lambda row: hash(frozenset(row)), axis=1)
# 按哈希键去重,再删除临时列
result = df.drop_duplicates(subset='unique_key').drop(columns='unique_key')

这个方法的性能略逊于Numpy排序(因为apply是逐行执行的),但代码可读性更高,适合中小规模数据集。

针对GroupBy场景的优化

如果要在GroupBy操作中嵌入这个去重逻辑,直接把排序逻辑整合到分组处理函数即可,避免额外的内存开销:

def deduplicate_group(group):
    sorted_rows = np.sort(group.values, axis=1)
    unique_idx = pd.DataFrame(sorted_rows).drop_duplicates().index
    return group.loc[unique_idx]

# 假设按某列分组后对每个组内去重
grouped_result = df.groupby('你的分组列').apply(deduplicate_group)

关键性能提示

  • 绝对不要用iterrows()或itertuples()逐行处理,这种方法在10万行以上的数据集会直接导致性能崩盘。
  • 如果数据包含空值,Numpy的sort会自动把空值排到末尾,但不影响去重逻辑——相同的空值组合排序后仍然一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:43:34