📜  将大 csv 分成大块 pandas - Python (1)

📅  最后修改于: 2023-12-03 15:39:16.062000             🧑  作者: Mango

将大 CSV 文件分块读取

通常情况下,Pandas 读取 CSV 文件是将整个文件加载到内存中再进行操作,但是当文件很大时,这样做会导致内存不足的问题。为了避免这个问题,我们可以将大的 CSV 文件分块读取。

准备工作

我们先创建一个包含 1000 行的 CSV 文件,文件名为 data.csv

import pandas as pd
import numpy as np
import csv

with open('data.csv', 'w') as f:
    writer = csv.writer(f)
    writer.writerow(['id', 'name', 'age'])
    for i in range(1000):
        writer.writerow([i + 1, f'User {i+1}', np.random.randint(18, 60)])
分块读取 CSV 文件

我们可以使用 pandas.read_csv() 方法,并设置 chunksize 参数来分块读取 CSV 文件。

chunk_size = 100  # 设置分块大小
csv_reader = pd.read_csv('data.csv', chunksize=chunk_size)

for i, chunk in enumerate(csv_reader):
    # 处理每个分块的数据
    print(f'Chunk {i+1}:')
    print(chunk)

输出结果:

Chunk 1:
    id     name  age
0    1   User 1   20
1    2   User 2   51
2    3   User 3   41
3    4   User 4   50
4    5   User 5   31
..  ..      ...  ...
95  96  User 96   52
96  97  User 97   20
97  98  User 98   57
98  99  User 99   59
99  100  User 100  19

[100 rows x 3 columns]
Chunk 2:
    id      name  age
100  101  User 101  44
101  102  User 102  27
102  103  User 103  40
103  104  User 104  18
104  105  User 105  36
..   ...       ...  ...
195  196  User 196  36
196  197  User 197  31
197  198  User 198  19
198  199  User 199  37
199  200  User 200  29

[100 rows x 3 columns]

...
处理每个分块

在上面的示例中,代码只是简单地打印了每个分块的数据。如果要处理分块中的数据,则需要在循环中添加代码进行处理。

for i, chunk in enumerate(csv_reader):
    # 对每个分块进行处理
    result = chunk.groupby('age').count().reset_index()
    
    # 将结果写入文件
    with open(f'result-{i+1}.csv', 'w') as f:
        result.to_csv(f, index=False)

上面的代码对每个分块进行了分组(按年龄分组),并统计每组数量。最后,将结果写入到一个独立的 CSV 文件 result-n.csv 中。

总结

以上就是如何将大 CSV 文件分块读取的介绍。通过设置 chunksize 参数,可以有效避免内存不足的问题。在使用分块处理数据时也可以进行一些列的数据处理,并将结果写入到独立的文件中。