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

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

写入 csv 使用 Pandas 957    来源:    2025-03-15

在使用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)

# 使用Dask的to_csv方法
ddf.to_csv('output-*.csv', index=False)

3. 使用fastparquetpyarrow写入Parquet格式

Parquet是一种列式存储格式,通常比CSV格式更快且更节省空间。你可以使用fastparquetpyarrow库将数据帧写入Parquet格式。

import pandas as pd

# 写入Parquet格式
df.to_parquet('output.parquet', engine='pyarrow')

4. 使用multiprocessing并行写入

通过多进程并行写入多个CSV文件,可以显著提高写入速度。

import pandas as pd
from multiprocessing import Pool

def write_chunk(chunk, filename):
    chunck.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)])

5. 使用csv模块直接写入

如果你不需要Pandas的其他功能,可以直接使用Python内置的csv模块来写入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是瓶颈,可以考虑将CSV文件压缩后再写入。

import pandas as pd

# 写入gzip压缩的CSV文件
df.to_csv('output.csv.gz', compression='gzip', index=False)

7. 使用pandas.DataFrame.to_csvcompression参数

Pandas的to_csv()方法支持直接压缩输出文件。

import pandas as pd

# 写入bz2压缩的CSV文件
df.to_csv('output.csv.bz2', compression='bz2', index=False)

8. 使用pandas.DataFrame.to_hdf

如果你需要频繁读写大数据帧,可以考虑使用HDF5格式。

import pandas as pd

# 写入HDF5文件
df.to_hdf('output.h5', key='df', mode='w')

总结

根据你的具体需求和环境,可以选择上述方法中的一种或多种组合来优化to_csv()的写入速度。对于非常大的数据集,通常推荐使用Dask、Parquet格式或多进程并行写入。