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

如何使用Pandas分块读取大型CSV文件并获取第三列的前N大值行

分块读取大CSV时获取第三列前N大行的方法

这个场景我太熟悉了——处理超大CSV时用分块读取,想抓某列的top N数据,直接用常规的nlargest肯定不行,得用「先收集各块top N,再全局筛选」的思路,具体步骤和代码如下:

核心思路

因为分块读取是把文件拆成小部分处理,我们没法直接对整个文件排序,所以:

  1. 对每个分块,先提取该块内第三列的前N大行
  2. 把所有块的这些top N行汇总到一起
  3. 最后在汇总的结果里再提取一次前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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 11:04:15