pandas处理较大数据量级的方法 - chunk,hdf,pkl

本文介绍了在处理大量CSV数据时,如何利用Python的pandas库分批读取和存储数据,以避免内存不足的问题。通过使用chunk、hdf5(h5)和pkl格式,实现了高效且节省内存的数据处理流程。推荐使用h5保存DataFrame和pkl保存字典,因为它们具有快速读取速度和良好的易用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

前情提要:   

工作原因需要处理一批约30G左右的CSV数据,数据量级不需要hadoop的使用,同时由于办公的本本内存较低的缘故,需要解读取数据时内存不足的原因。

操作流程:

方法与方式:首先是读取数据,常见的csv格式读取时一次性全部读取进来, 面对数据量较大(本次3亿条实车数据)时,需要 分批 并且有 选择性 的读取后 提取有效信息 删除冗余信息并清理内存。

同时,为了使处理数据时效率更高,将整理好的数据实时读取进来以后,保存成快速且可读的数据形式另行存储。然后释放内存并读取下一批数据直到整个流程结束

 

下面是操作代码:

#import pickle # pkl存储与 hdf5存储
import pandas as pd
# 释放内存
import gc
reader = pd.read_csv(r'E:\VEH_GBK_2019-01-01.csv', encoding='gbk',iterator=True,low_memory=False,usecols=[0,1,2,4])
title_mc=['location
<think>好的,用户现在问的是“如何保存数据集”。我需要回顾之前的对话历史。之前用户让写一个Python代码来做数据增强,生成300条新数据,并保存结果。我的回答里已经包含了保存数据的代码,使用to_excel方法。现在用户可能想更全面地了解保存数据集的不同方法,或者想确认其他保存方式。 首先,用户可能在使用数据增强代码后,想了解更多的保存选项,比如不同的格式或者考虑因素。他们可能需要知道各种格式的优缺点,比如CSV、Excel、Pickle等,以及什么时候该用哪一种。 接下来,我要考虑用户的使用场景。用户可能是数据分析师、学生或者研究人员,处理数值数据,可能需要在不同工具之间共享数据,或者需要长期保存数据。他们可能对技术细节不太熟悉,所以需要简单明了的解释。 用户的需求可能不仅仅是保存数据,还可能包括如何正确选择格式、处理大数据集时的注意事项、保存时的最佳实践,比如保留原始数据、版本控制等。深层需求可能是确保数据的可复用性、可共享性以及后续处理的方便性。 我需要分步骤回答,首先介绍常用格式,比较它们的优缺点,然后给出具体示例代码,最后提供注意事项和建议。这样结构清晰,用户能逐步了解。需要确保使用中文,避免专业术语过多,必要时解释术语,比如Parquet格式。 还要注意用户之前用的是Excel,所以可能需要强调CSV和Excel的区别,以及何时使用其他格式。例如,大数据集用Parquet更高效,需要跨平台用CSV,需要保留格式用Excel等。 另外,用户可能关心如何保存带有特殊数据类型的数据,比如日期、分类变量,这时候可以提到HDF5或Pickle。同时,安全性和兼容性也是考虑点,比如Pickle的安全问题,JSON的兼容性。 最后,注意事项部分需要提醒备份、元数据、版本控制,这些是数据管理的重要方面,用户可能没有意识到,但很重要。示例代码部分需要覆盖不同格式,用pandas实现,因为用户已经用了pandas,这样他们能直接参考。 总结,我需要提供一个全面的指南,涵盖各种保存方法,适用场景,示例代码和注意事项,帮助用户根据具体需求选择合适的方式保存数据集。</think>以下是数据集保存的常见方法及最佳实践指南,包含多种格式的对比和具体实现: --- ### **一、常用数据保存格式对比** | 格式 | 优点 | 缺点 | 适用场景 | 示例扩展名 | |------|------|------|----------|------------| | **CSV** | 跨平台、易读、通用 | 无数据类型存储、大文件效率低 | 小型数据交换 | `.csv` | | **Excel** | 支持多工作表、保留格式 | 处理速度慢、非开源格式 | 人工查看/编辑 | `.xlsx` | | **Parquet** | 列式存储、压缩率高 | 需要专用库读取 | 大数据处理 | `.parquet` | | **HDF5** | 高效存储科学数据 | 结构复杂、依赖库 | 数值型大数据 | `.h5` | | **Pickle** | 保留Python对象结构 | 仅限Python使用 | 中间结果暂存 | `.pkl` | | **JSON** | 结构化存储、Web友好 | 存储效率较低 | 配置/嵌套数据 | `.json` | --- ### **二、Python实现代码示例** #### 1. **CSV格式** ```python import pandas as pd # 保存数据 df.to_csv('data.csv', index=False, # 不保存行索引 encoding='utf-8-sig') # 支持中文 # 读取验证 pd.read_csv('data.csv') ``` #### 2. **Excel格式(优化版)** ```python with pd.ExcelWriter('data.xlsx', engine='openpyxl', datetime_format='YYYY-MM-DD', # 日期格式化 mode='w') as writer: df.to_excel(writer, sheet_name='MainData', index=False, freeze_panes=(1,0)) # 冻结表头 ``` #### 3. **Parquet格式(适合大数据)** ```python df.to_parquet('data.parquet', engine='pyarrow', # 更快的引擎 compression='snappy') # 平衡压缩率与速度 ``` #### 4. **HDF5格式(科学数据专用)** ```python df.to_hdf('data.h5', key='experiment1', # 数据集标识 mode='w', complevel=5) # 压缩等级(0-9) ``` #### 5. **分层存储(多数据集管理)** ```python with pd.HDFStore('project_data.h5') as store: store.put('raw_data', df_raw) # 原始数据 store.put('processed_data', df_clean) # 处理后的数据 store.put('metadata', pd.Series({ 'author': '张三', 'create_date': pd.Timestamp.now() })) # 存储元数据 ``` --- ### **三、保存注意事项** #### **1. 数据校验策略** ```python # 保存前校验 assert not df.isnull().values.any(), "存在空值需要处理" assert df.duplicated().sum() == 0, "存在重复数据" # 保存后验证 loaded_df = pd.read_parquet('data.parquet') pd.testing.assert_frame_equal(df, loaded_df) # 严格比对 ``` #### **2. 大数据优化技巧** - **分块存储**: ```python # 分块保存CSV(每100万行一个文件) for i, chunk in enumerate(pd.read_csv('bigdata.csv', chunksize=1e6)): chunk.to_parquet(f'part_{i}.parquet') ``` - **类型优化**: ```python df = df.astype({ 'age': 'uint8', # 0-255年龄 'price': 'float32', # 价格数据 'flag': 'category' # 分类变量 }) ``` #### **3. 版本控制规范** ```python from datetime import datetime version = datetime.now().strftime("%Y%m%d_%H%M") df.to_csv(f'data_v{version}.csv', index=False) ``` --- ### **四、格式选择建议** 1. **优先使用列式存储**(Parquet/ORC)当: - 数据量 > 1GB - 需要快速列查询 - 需要与Spark等大数据工具交互 2. **优先使用CSV/Excel**当: - 需要人工查看/编辑 - 与其他非技术人员共享 - 数据量 < 100MB 3. **使用HDF5/Pickle**当: - 需要保存复杂数据结构 - 存储数值型科学数据 - 需要超高速读取 --- ### **五、安全存储实践** 1. **数据加密**(适用于敏感数据): ```python import pyarrow.parquet.encryption as pe df.to_parquet('encrypted.parquet', encryption_properties=pe.EncryptionConfiguration( key='my_secret_key', algorithm='AES_GCM_256' )) ``` 2. **自动备份机制**: ```python import shutil from pathlib import Path def backup_file(filepath): backup_dir = Path('backups') backup_dir.mkdir(exist_ok=True) timestamp = datetime.now().strftime("%Y%m%d_%H%M") shutil.copy(filepath, backup_dir / f"{timestamp}_{Path(filepath).name}") ``` --- 根据具体需求选择保存方式,需要帮助调整代码或了解特定格式的细节可以告诉我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值