使用Pandas处理35GB大文件:读取单列并chunk统计最高频次名称
处理超大CSV文件:分块读取目标列并统计名称频次
太懂这种崩溃的感觉了——35GB的文件直接怼进内存,kernel扛不住简直太正常!咱们换个轻量思路,只加载需要的列+分块处理,既能避开内存爆炸,又能精准完成统计,下面是具体方案:
核心思路拆解
- 只读取目标列:用
usecols参数指定仅加载"名称"列(替换成你实际的列名),砍掉99%不需要的数据 - 分块迭代读取:用
chunksize把大文件切成小块分批处理,每次只在内存里存一小部分数据 - 累计统计频次:每处理一块就统计该块的名称出现次数,逐步累加得到全局结果
完整可运行代码
import pandas as pd # 初始化空Series,用来存累计的名称频次 name_total_counts = pd.Series(dtype='int64') # 启动分块读取:只加载名称列,每次读10万行(可根据你的内存调整大小) chunk_iterator = pd.read_csv( "/Users/Desktop/EQR_Data/EQR_Transactions_1.csv", usecols=['名称'], # 这里替换成你文件中实际的名称列名 chunksize=100000, low_memory=False ) # 遍历每一块,逐步累加统计结果 for idx, chunk in enumerate(chunk_iterator, 1): # 统计当前块的名称频次 chunk_counts = chunk['名称'].value_counts() # 和全局统计合并,缺失的名称用0填充后累加 name_total_counts = name_total_counts.add(chunk_counts, fill_value=0) # 可选:打印进度,避免长时间等待无反馈 print(f"已完成第{idx}块处理,累计统计{int(name_total_counts.sum())}条记录") # 找出频次最高的名称及其次数 top_name = name_total_counts.idxmax() top_count = int(name_total_counts.max()) print(f"\n频次最高的名称是:{top_name},累计出现{top_count}次")
额外优化小技巧
- 如果内存特别紧张,把
chunksize调小(比如5万、1万行),牺牲一点速度换内存安全 - 若名称列存在缺失值,统计前可以加
chunk['名称'].dropna(),避免把NaN也算作一个"名称" - 追求更快速度的话,还可以试试
dask.dataframe——它专门处理超大数据集,语法和Pandas几乎一致,底层会自动并行处理分块
内容的提问来源于stack exchange,提问作者SOCO
相关产品推荐
相关产品推荐

