如何高效将超大CSV指定多列快速追加到DataFrame中
超大型CSV处理性能优化方案
你的代码卡顿、运行慢的核心原因有两个:
- 读入CSV时默认加载全部列,222万行的全量数据会占用大量不必要的内存,直接拖慢整机运行速度
- 逐行写for循环、用
loc取值再逐次append到列表的写法,是pandas中效率最低的操作方式,比原生向量化操作慢百倍以上,逐次append还会反复触发列表内存扩容,额外消耗性能。
具体优化步骤
- 读入环节就裁剪无关数据,不要全量加载
用read_csv的usecols参数指定只读取你需要的3列,从源头上减少内存占用。如果明确知道每列的数据类型,还可以通过dtype参数指定更小的数值类型,进一步压缩内存:import pandas as pd dataset = pd.read_csv( r'/Users/ha/GTruth/sumo-output-w/file_name.csv', # 仅读取需要的列,跳过所有无关字段 usecols=["pos_x", "pos_y", "labels"], # 可选:根据你的实际数据类型指定,进一步降内存,比如坐标用32位浮点数、标签用小范围整数 # dtype={"pos_x": "float32", "pos_y": "float32", "labels": "int16"} ) - 彻底删除逐行循环逻辑,用pandas原生向量化操作直接批量生成目标列表
不需要逐行遍历取值,pandas的批量列操作是C层实现的,222万行的数据处理仅需数秒即可完成:# 批量取pos_x、pos_y两列,直接转为每行一个坐标对的嵌套列表 input_data = dataset[["pos_x", "pos_y"]].values.tolist() # 批量取labels列,直接转为标签列表 output_data = dataset["labels"].tolist()
性能参考
优化后的代码整体运行时间通常在10秒以内(取决于磁盘读写速度),内存占用仅为原写法的1/5~1/10,不会出现整机卡顿的情况。
注意:除非迫不得已,永远不要在pandas中写逐行for循环配合loc/iloc取值,这类操作的性能损耗极大,绝大多数数据处理需求都可以通过pandas原生的批量向量化接口实现。
内容的提问来源于stack exchange,提问作者ttina
相关产品推荐
相关产品推荐

