Pandas数据集的分块读取的实现

  • Post category:Python

Pandas是Python中重要的数据处理库之一,支持读取多种格式的数据,并提供了许多高级的数据处理和分析功能。但是当数据集非常大的时候,一次性读取可能会导致内存不足、速度过慢等问题,因此,Pandas提供了分块读取的实现,可以有效处理大型数据集。

一、为什么要分块读取数据集

数据量变得越来越大,传统的数据处理方式已经无法满足需求,因此分块读取数据集成为了解决这个问题的一个非常有效的方法。

分块读取数据集的优势:

  • 节省内存:只读取部分数据,减少内存消耗;
  • 提高效率:避免一次性读取数据集造成的速度过慢问题;
  • 增强程序鲁棒性: 在处理非常大型数据集的时候,有可能由于内存不足或其他原因导致程序崩溃,通过分块读取可以降低这种问题的发生率。

二、如何实现分块读取数据集

Pandas使用read_csv函数读取大型数据文件时,底层采用了迭代器模式,主要的实现思路是:将数据集分成若干分块,每块读取一部分数据,直到整个文件全部读取完成。这个过程中,要注意以下几个问题:

2.1 防止内存溢出

在读取大型文件时,我们要避免一次性读取文件,防止内存溢出,因此我们需要控制每次读取数据块的大小。在read_csv函数中,我们可以通过指定chunksize参数来控制每次读取的行数,比如以下示例:

import pandas as pd

for chunk in pd.read_csv('data.csv', chunksize=5000):
    # 迭代处理每个数据块
    ...

2.2 去除重复行和空行

有时候可能文件中会包含重复行和空行,如果不处理的话,会浪费内存和CPU周期,进而长时间占用系统资源,因此在分块读取数据时,我们需要注意进行去重和删除空行操作。在每个数据块内,可以采用如下方式实现:

chunk = chunk.drop_duplicates()  # 删除重复行
chunk = chunk.dropna(how='all')  # 删除空行

2.3 处理缺失值

当数据集中包含缺失值时,我们也需要进行处理。在read_csv函数中,可以通过指定na_values参数,将指定单元格中的缺失值转换为NaN,然后在每个数据块内使用fillna方法填补缺失值。

import pandas as pd

for chunk in pd.read_csv('data.csv', chunksize=5000, na_values=['NA']):
    chunk = chunk.fillna(method='ffill')  # 后一个数值填补缺失值

通过上述处理方法,我们可以有效地分块读取大型数据集,提高程序的效率和鲁棒性。

三、示例说明

下面,我们通过两个实例,为大家演示如何使用Pandas分块读取大型数据集:

3.1 读取CSV文件

首先,我们有一个大小为3.5GB的数据集,里面包含2000万条数据记录,我们需要对其进行数据清洗和处理。我们首先使用read_csv函数,实现分块读取:

import pandas as pd

# 读取数据,每次读取10000行
for chunk in pd.read_csv('data.csv', chunksize=10000, dtype={'id': str, 'score': float}):
    # 处理数据块,去重、删除空行、填充缺失值
    chunk = chunk.drop_duplicates()
    chunk = chunk.dropna(how='all')
    chunk['score'].fillna(method='ffill', inplace=True)
    ...

在每个数据块内,我们可以利用pandas的各种数据处理方法,对数据进行清洗和处理。当然,最后我们还需要将处理好的数据合并成一个新的DataFrame,可以采用如下代码:

import pandas as pd

result = pd.DataFrame()
for chunk in pd.read_csv('data.csv', chunksize=10000, dtype={'id': str, 'score': float}):
    chunk = chunk.drop_duplicates()
    chunk = chunk.dropna(how='all')
    chunk['score'].fillna(method='ffill', inplace=True)
    result = pd.concat([result, chunk])

# 合并后的result DataFrame 可以继续进行数据分析或者 Export 到 Csv 文件。
result.to_csv('clean_data.csv', index=False)

3.2 读取Excel文件

其次,我们有一个10G+的Excel文件,里面包含近百个工作表,每个工作表包含百万条数据,我们需要将所有数据集中到一张表中,并进行处理。此时,我们可以借助openpyxl库和pandas,实现数据的分块读取、处理和合并:

import pandas as pd
from openpyxl import load_workbook

result = pd.DataFrame()
# 读取Excel文件
with pd.ExcelFile('data.xlsx') as xls:
     # 遍历Excel的每个工作表,并读取每个数据块
    for sheet_name in xls.sheet_names:
        for chunk in pd.read_excel(xls, sheet_name, chunksize=10000, skiprows=0):
            # 数据清洗、处理和转换
            ...
            # 合并处理好的数据
            result = pd.concat([result, chunk])

# 保存处理完成的结果
result.to_excel('clean_data.xlsx', index=False)

上述代码中,我们首先使用pd.ExcelFile打开Excel文件,并通过for循环遍历Excel的每个工作表,然后在每个工作表内,使用pd.read_excel函数,通过chunksize指定每次读取的行数(这种方式只能读取数据,不能读取格式),接着数据处理(去重、删除空行、填补缺失值等),最后将处理好的数据合并成一个新的DataFrame,最后保存到新的Excel文件中。

通过上述示例,我们可以看到,使用Pandas分块读取大型数据集是非常简单的,只要掌握好实现方法和注意要点,就能够处理任意规模的数据集。