Python Pandas保留首行删除重复行超时 如何实现更高效方案?
Pandas DataFrame 去重保留首行的高效优化方案
原生drop_duplicates本身是Pandas官方做过性能优化的接口,运行超时一般是大数据量下参数设置不合理、字段类型冗余导致的,可按以下优先级优化:
缩小判重字段范围
如果不需要全列内容一致才判定为重复,不要使用subset=None,明确指定需要判重的列即可,大幅降低哈希计算开销:# 示例:仅用col1、col2两列判重,按需修改你的实际判重字段 df.drop_duplicates(subset=['col1', 'col2'], keep='first', inplace=True, ignore_index=True)优化字段数据类型
字符串类型的列做哈希计算开销极高,提前转成category类型可提升数倍性能:# 所有需要参与判重的字符串列都转成category类型 df['col1'] = df['col1'].astype('category') df.drop_duplicates(subset=None, keep='first', inplace=True, ignore_index=True)千万行以上超大数据集用Numpy方案替代
利用Numpy的底层优化能力,比原生Pandas接口快30%-60%,注意如果有浮点数列要提前处理精度避免误判:import numpy as np # 提取行数据找首次出现的索引 _, unique_idx = np.unique(df.to_records(index=False), return_index=True) # 按原始顺序取数并重置索引 df = df.iloc[np.sort(unique_idx)].reset_index(drop=True)内存放不下的超大文件用分块处理
单表超过内存容量时用Dask分块处理,接口和Pandas几乎完全兼容:import dask.dataframe as dd # 按内存情况设置分块数,示例分4块处理 ddf = dd.from_pandas(df, npartitions=4) ddf = ddf.drop_duplicates(subset=None, keep='first', ignore_index=True) df = ddf.compute()
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

