0

0

如何高效处理超大CSV文件并计算列间差值与行间变化量

聖光之護

聖光之護

发布时间:2026-01-31 09:32:02

|

197人浏览过

|

来源于php中文网

原创

如何高效处理超大CSV文件并计算列间差值与行间变化量

本文介绍使用pandas分块读取gb级csv文件(如2亿行),通过列名安全访问数据、计算列间比值/差值及行间变化量,并流式写入结果,避免内存溢出。

处理数百兆乃至数GB的CSV文件时,绝不能一次性加载到内存——这会导致MemoryError或系统卡死。正确做法是采用分块(chunking)+ 流式计算 + 迭代写入策略。以下是一个健壮、可扩展的完整解决方案。

✅ 正确做法:分块处理 + 列名索引 + 差分计算

首先明确关键修正点:

网易人工智能
网易人工智能

网易数帆多媒体智能生产力平台

下载
  • for row in chunk: 遍历的是列名(str),不是行数据 → 应改用 .iterrows() 或向量化操作;
  • pd.write_csv() 不存在 → 正确方法是 chunk.to_csv(..., mode='a', header=False);
  • 行间差值(如 width_diff = current['Width'] - previous['Width'])需保存上一块的末行,或使用 .diff()(推荐);
  • 对于超大数据优先使用向量化运算(快且内存友好),避免逐行循环。

✅ 推荐实现(含列计算 + 行差分 + 增量保存)

import pandas as pd

file_in = r"B:\Users\user\Documents\huge-dataset.csv"
file_out = r"B:\Users\user\Documents\aggregate.csv"

# 第一次写入时保留表头,后续追加不写表头
first_chunk = True

for chunk in pd.read_csv(file_in, chunksize=100_000):
    # ✅ 使用列名安全计算(自动广播,无需循环)
    chunk['ratio'] = chunk['Width'] / chunk['Length']  # 避免除零?可加 fillna 或 clip
    chunk['width_length_diff'] = chunk['Width'] - chunk['Length']

    # ✅ 行间差分:当前行 Width 减前一行 Width(首行为 NaN)
    chunk['width_diff_from_prev'] = chunk['Width'].diff()

    # ✅ 可选:跨块连续差分(若需全局时序连续性)
    # 需在循环外维护 prev_last_width,此处为简化省略;多数场景 .diff() 已满足需求

    # ✅ 流式写入:mode='a' 追加,header=first_chunk 控制仅首块写表头
    chunk[['DateTime', 'ratio', 'width_length_diff', 'width_diff_from_prev']].to_csv(
        file_out,
        mode='a',
        header=first_chunk,
        index=False
    )
    first_chunk = False

print(f"✅ 处理完成,结果已保存至 {file_out}")

⚠️ 注意事项与最佳实践

  • 避免 .iterrows():它返回 (index, Series),速度慢且破坏向量化优势;99% 场景用直接列运算(如 chunk['A'] + chunk['B'])即可。
  • 空值与异常处理
    chunk['ratio'] = (chunk['Width'] / chunk['Length']).replace([float('inf'), -float('inf')], float('nan'))
  • 内存优化技巧
    • 指定 dtype(如 dtype={'Count': 'uint32', 'Age': 'uint8'})减少内存占用
    • 使用 usecols=['DateTime','Width','Length'] 仅读取必要列;
    • 对 DateTime 列添加 parse_dates=['DateTime'] 并设 infer_datetime_format=True 加速解析。
  • 行间依赖进阶:若需严格跨块的“上一行”(如累计差分),可在每块处理前保存上一块末行值,并在当前块首行手动计算差值,再调用 .diff() 处理剩余行。

✅ 总结

面对超大CSV,核心原则是:向量化 > 迭代,分块 > 全量,流式写入 > 内存暂存。利用 pandas.read_csv(chunksize=...) + 列名索引 + .diff() + to_csv(mode='a') 四步组合,即可安全、高效完成列运算与行间分析,全程内存可控,代码简洁可靠。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

70

2025.12.04

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

198

2023.11.20

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

928

2023.09.19

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

4

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

1

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

1

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

16

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 5万人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.2万人学习

Django 教程
Django 教程

共28课时 | 3.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号