插件窝 干货文章 Pandas to_csv()写入大数据帧速度慢,如何高效解决?

Pandas to_csv()写入大数据帧速度慢,如何高效解决?

写入 使用 csv 可以 322    来源:    2025-03-13

在使用Pandas的to_csv()方法写入大数据帧时,可能会遇到速度较慢的问题。以下是一些提高写入速度的方法:

1. 使用chunksize参数

将大数据帧分成较小的块进行写入,可以减少内存占用并提高写入速度。

import pandas as pd

# 假设df是你的大数据帧
chunksize = 100000  # 每块的大小
for i, chunk in enumerate(range(0, len(df), chunksize)):
    df_chunk = df[i:i + chunksize]
    header = i == 0  # 只在第一块写入表头
    df_chunk.to_csv('output.csv', mode='a', header=header, index=False)

2. 使用dask.dataframe

Dask是一个并行计算库,可以处理比内存更大的数据集。你可以使用Dask的to_csv()方法来加速写入。

import dask.dataframe as dd

# 将Pandas DataFrame转换为Dask DataFrame
ddf = dd.from_pandas(df, npartitions=10)

# 写入CSV文件
ddf.to_csv('output-*.csv', index=False)

3. 使用fastparquetpyarrow写入Parquet格式

Parquet是一种列式存储格式,通常比CSV更高效。你可以使用fastparquetpyarrow库将数据帧写入Parquet格式。

df.to_parquet('output.parquet', engine='pyarrow')

4. 使用multiprocessing并行写入

通过多进程并行写入多个CSV文件,最后再合并这些文件。

import pandas as pd
from multiprocessing import Pool

def write_chunk(chunk, filename):
    chunk.to_csv(filename, index=False)

# 假设df是你的大数据帧
chunksize = 100000
chunks = [df[i:i + chunksize] for i in range(0, len(df), chunksize)]

with Pool() as pool:
    pool.starmap(write_chunk, [(chunk, f'output_{i}.csv') for i, chunk in enumerate(chunks)])

# 合并CSV文件
with open('output.csv', 'w') as outfile:
    for i in range(len(chunks)):
        with open(f'output_{i}.csv') as infile:
            if i != 0:
                infile.readline()  # 跳过表头
            outfile.write(infile.read())

5. 使用csv模块直接写入

如果你不需要Pandas的其他功能,可以直接使用Python的csv模块进行写入,这样可以减少一些开销。

import csv

with open('output.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(df.columns)  # 写入表头
    for row in df.itertuples(index=False, name=None):
        writer.writerow(row)

6. 使用gzipbz2压缩

如果磁盘I/O是瓶颈,可以考虑使用压缩格式写入文件。

df.to_csv('output.csv.gz', compression='gzip', index=False)

7. 使用swifter

swifter库可以自动并行化Pandas操作,包括to_csv()

import swifter

df.swifter.to_csv('output.csv', index=False)

8. 使用numpy直接写入

如果数据帧主要是数值数据,可以考虑使用numpytofile()方法。

import numpy as np

np.savetxt('output.csv', df.values, delimiter=',', header=','.join(df.columns), comments='')

总结

选择哪种方法取决于你的具体需求和环境。如果内存足够,使用chunksizedask可能是最简单有效的方法。如果需要更高的性能,可以考虑使用并行处理或更高效的存储格式如Parquet。