pandas可通过分块处理、类型优化、query/eval加速及接入dask/polars等策略高效处理gb级数据。关键在于分治、延迟计算与资源协同,而非硬扛超大规模数据。

处理大数据时,Pandas 本身不是为超大规模数据设计的,但通过合理策略,它仍可高效应对 GB 级别、甚至接近单机内存上限的数据任务。关键不在于“硬扛”,而在于分治、延迟计算和资源协同。
用 chunksize 分块读取与处理
直接 pd.read_csv() 加载几十 GB 文件极易触发 MemoryError。改用分块流式处理,边读边算,不全量驻留内存:
- 设置
chunksize=50000(根据行宽和可用内存调整),返回可迭代的TextFileReader - 对每块做过滤、聚合或转换,再用
pd.concat()合并结果(仅合并最终需要的部分,避免拼回完整 DataFrame) - 示例:统计某列出现频次,可对每块调用
value_counts(),再用sum()合并各块结果
优先使用 category 和 Nullable dtypes
字符串列和缺失值是内存大户。优化类型能立竿见影:
- 对低基数文本列(如状态、城市名),转为
'category'类型,内存常降 5–10 倍 - 用
Int64、Boolean等可空整数/布尔类型替代float64或Object存缺失整数/布尔,更省内存且语义清晰 - 读取时用
dtype参数预设类型,或用df.astype()批量转换,避免后期推断开销
用 query() 和 eval() 替代布尔索引
对大 DataFrame 做条件筛选或计算时,字符串表达式比 python 表达式更快更省内存:
立即学习“Python免费学习笔记(深入)”;
-
df.query('age > 30 and city == "Beijing"')比df[(df.age > 30) & (df.city == "Beijing")]更快,且支持局部变量(@var) -
df.eval('income_after_tax = income * (1 - tax_rate)')比df['income_after_tax'] = df.income * (1 - df.tax_rate)占用更少临时内存 - 注意:确保表达式中列名不含空格或特殊字符,否则需用反引号包裹,如
`user id`
必要时接入 Dask 或 Polars
当 Pandas 优化已达瓶颈(如需跨核并行、外存计算或极宽表操作),应主动切换工具链: