使用Pandas加载CSV至DataFrame时如何过滤重复记录
关于Pandas读取CSV时能否直接过滤重复记录的解答
Pandas 原生read_csv()接口没有内置读取阶段自动过滤重复行的参数,无法在数据完全加载入内存前完成全量重复记录过滤。本质原因是CSV为逐行解析格式,要判定某一行是否为重复记录,必须将其与此前已读取的所有行做特征比对,这个逻辑和先加载为DataFrame再去重的计算过程完全一致,不存在本质的性能或内存差异。
日常处理普通大小的CSV文件时,直接在读取语句后链式调用去重方法即可,写法简洁,和“读取过程中处理”的使用体验没有区别:
import pandas as pd # 全字段匹配去重 df = pd.read_csv("your_file.csv").drop_duplicates() # 如果需要按指定字段判定重复,传入subset参数即可 # df = pd.read_csv("your_file.csv").drop_duplicates(subset=["user_id", "trade_no"])
如果处理体积远超可用内存的超大CSV文件,可以通过分块读取的方式在读取流程中渐进式去重,大幅降低峰值内存占用:
chunk_size = 10000 # 单块读取行数,可根据机器内存调整 temp_chunks = [] # 逐块读取文件 for chunk in pd.read_csv("your_large_file.csv", chunksize=chunk_size): # 先完成单块内的去重,减少待合并的数据量 temp_chunks.append(chunk.drop_duplicates()) # 合并所有分块后,做一次跨分块的全局去重得到最终结果 df = pd.concat(temp_chunks, ignore_index=True).drop_duplicates()
注意:不存在比“加载后去重”性能明显更优的“读取时去重”方案。哪怕自行实现原生Python逐行读CSV、边读边判断重复的逻辑,底层同样需要缓存所有已出现行的哈希值做比对,和Pandas内置去重的效率差极小,直接使用Pandas原生链式写法的维护成本最低。
内容的提问来源于stack exchange,提问作者Sunil Shukla
相关产品推荐
相关产品推荐

