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

如何优化多次调用DataFrame.drop_duplicates()的执行效率?

优化按指定列去重并保留最后一行的性能

针对你多次调用df.drop_duplicates(subset=["Column"], keep='last')耗时较长的问题,这里分享几个实用的优化方案:

1. 利用索引直接筛选(替代重复调用drop_duplicates)

比起反复调用drop_duplicates,先定位到每个分组最后一行的索引再切片,能减少内部重复计算的开销:

方案A:通过groupby取最后一行索引

# 获取指定列每个分组最后一行的索引
last_indices = df.groupby("Column").tail(1).index
# 直接筛选目标行
df = df.loc[last_indices]

方案B:反转DataFrame后用keep='first'再反转

drop_duplicates(keep='first')的底层实现有时比keep='last'更高效,通过反转DataFrame可以间接实现保留最后一行的效果:

# 反转顺序→去重保留第一个→再反转回原顺序
df = df.iloc[::-1].drop_duplicates(subset=["Column"], keep='first').iloc[::-1]

2. 合并重复调用,减少不必要的计算

如果你的函数是多次执行去重操作,尽量合并批量处理:

  • 若需对多列去重,一次性将所有列传入subset参数,而非多次单列调用;
  • 若处理多个同结构的小DataFrame,先合并为一个大DataFrame完成去重,再拆分回原结构,减少多次调用的初始化开销。

3. 切换高效数据后端或分布式库

针对超大规模数据集,可以尝试:

  • PyArrow后端加速(Pandas 2.0+支持):将数据类型切换为PyArrow格式,能提升部分操作的性能:
    # 全局设置PyArrow后端
    pd.set_option('mode.dtype_backend', 'pyarrow')
    # 或创建DataFrame时指定
    df = pd.read_csv('data.csv', dtype_backend='pyarrow')
    
  • Dask并行处理:对于无法单机处理的超大数据集,用Dask进行分布式去重:
    import dask.dataframe as dd
    # 将Pandas DataFrame转为Dask DataFrame
    ddf = dd.from_pandas(df, npartitions=4)
    # 执行去重
    ddf = ddf.drop_duplicates(subset=["Column"], keep='last')
    # 转回Pandas DataFrame
    df = ddf.compute()
    

4. 基于Numpy底层操作实现去重

利用Numpy的数组操作直接定位最后一次出现的重复项,跳过Pandas的高层封装开销:

import numpy as np

col_values = df["Column"].values
# 反转数组后找唯一值的首次出现索引,再转换为原数组的最后出现位置
_, reverse_idx = np.unique(col_values[::-1], return_index=True)
last_positions = len(col_values) - 1 - reverse_idx
# 按位置筛选行
df = df.iloc[last_positions]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 13:35:05