如何优化多次调用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
相关产品推荐
相关产品推荐

