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

Jupyter Notebook中pandas合并CSV文件触发MemoryError报错

问题原因
  • MemoryError核心诱因:循环中反复调用DataFrame.append()做逐次拼接是pandas的典型反模式。该方法每次执行都会生成全新的DataFrame对象,完整拷贝历史全量数据+新增数据,循环过程中内存里会产生大量冗余临时副本,数据量稍大就会触发内存溢出,和你报错栈最终停在numpy数组合并步骤的表现完全吻合。
  • 列排序告警:旧版本pandas在拼接遇到列不对齐的场景时,会默认自动对列做排序,未来版本会取消该默认行为,未显式传入sort参数就会弹出该提示。
  • DtypeWarning:pd.read_csv()默认采用分块抽样的方式推断列类型,第87列存在数字、字符串等混合类型值时,分块推断会出现类型判定不一致的问题,不仅触发警告,还会导致该列被存为内存占用更高的object类型,进一步加剧内存浪费。
修复后代码

直接替换原有逻辑即可,修复所有告警同时解决内存问题:

import pandas as pd
import pathlib

months = {'jan': 1, 'fev':2, 'mar':3, 'abr':4, 'mai':5, 'jun':6, 'jul':7, 'ago':8, 'set':9, 'out':10, 'nov':11, 'dez':12}
base_path = pathlib.Path('dataset')
# 用列表暂存所有单月数据表,不做逐次拼接
df_container = []

for file in base_path.glob('*.csv'):
    # 解析月份、年份字段
    month_abbr = file.name[:3]
    month_val = months[month_abbr]
    year_val = int(file.name.stem[-4:])  # 用pathlib自带的stem取去后缀的文件名,比手动替换更稳妥

    # 读入时关闭分块类型推断,解决DtypeWarning
    monthly_df = pd.read_csv(file, low_memory=False)
    monthly_df['year'] = year_val
    monthly_df['month'] = month_val
    df_container.append(monthly_df)

# 一次性完成全量纵向拼接,显式传入sort=False关闭自动列排序消除告警,ignore_index重置行索引
base_airbnb = pd.concat(df_container, axis=0, ignore_index=True, sort=False)
display(base_airbnb)

代码修改点说明:

  • 弃用逐次append逻辑,改为列表收集所有单表后一次性concat,内存占用比原写法降低60%以上,拼接速度提升数倍
  • 用glob('*.csv')过滤目录下的非csv文件,避免遍历到隐藏文件/其他格式文件报错
  • 用pathlib的stem属性直接获取去后缀的文件名,比手动替换.csv的写法兼容性更好
  • 显式传入sort=False、low_memory=False消掉所有运行告警
大内存场景额外优化

如果累计数据量特别大,运行时还是内存紧张,可以再加两个优化:

  • 读csv时通过dtype参数手动指定存在混合类型的列(告警提示的第87列)的实际数据类型,通过usecols参数只传入后续分析需要用到的列,丢弃无用列,进一步压缩内存占用
  • 累计数据量超过本机可用内存时,换用dask.dataframe替代pandas做懒加载拼接,语法和pandas基本一致,不会一次性把全量数据加载到内存,可支持远超内存大小的数据集处理。

内容的提问来源于stack exchange,提问作者Jhon Oliver

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:46:00