如何使用Pandas分块读取大型CSV文件并获取第三列的前N大值行
分块读取大CSV时获取第三列前N大行的方法
这个场景我太熟悉了——处理超大CSV时用分块读取,想抓某列的top N数据,直接用常规的nlargest肯定不行,得用「先收集各块top N,再全局筛选」的思路,具体步骤和代码如下:
核心思路
因为分块读取是把文件拆成小部分处理,我们没法直接对整个文件排序,所以:
- 对每个分块,先提取该块内第三列的前N大行
- 把所有块的这些top N行汇总到一起
- 最后在汇总的结果里再提取一次前N大行,这样得到的就是整个文件中第三列的前N大的行
完整代码示例
import pandas as pd # 替换成你需要的前N个数 N = 100 # 初始化空DataFrame存中间结果 top_n_collection = pd.DataFrame() # 遍历每个分块 for chunk in pd.read_csv("test.csv", sep=" ", chunksize=100000): # 获取第三列的列名(如果知道列名可以直接写,比如'column_3') third_column = chunk.columns[2] # 提取当前块中第三列前N大的行 chunk_top_n = chunk.nlargest(N, third_column) # 追加到汇总结果中 top_n_collection = pd.concat([top_n_collection, chunk_top_n], ignore_index=True) # 从所有块的top N中筛选出全局的前N大 final_top_n = top_n_collection.nlargest(N, third_column) # 查看结果或者保存 print(final_top_n) # final_top_n.to_csv("global_top_n.csv", index=False)
关键细节说明
- 列名处理:如果你知道第三列的具体名称,直接把
chunk.columns[2]换成列名(比如'sales')更直观;如果不确定列名,用chunk.columns[2]能准确定位第三列(索引从0开始) - 为什么要两次筛选:每个块的top N只是该块内的最大值,整个文件的top N可能分散在不同块里,汇总后再筛选一次才能确保拿到全局的前N大
- 内存优化:因为每个块只保留N行,汇总后的DataFrame大小最多是
块数×N,远小于原文件,不会占用过多内存 - 特殊情况处理:如果第三列有缺失值,
nlargest默认会忽略NaN;如果需要包含缺失值,可以添加参数keep='all',不过一般场景下默认设置就够用
内容的提问来源于stack exchange,提问作者Win
相关产品推荐
相关产品推荐

