Kim*_*oll 11 python csv dataframe pandas
我猜这是一个简单的解决方案,但是我遇到了一个问题,即使用to_csv()函数将pandas数据帧保存到csv文件需要将近一个小时.我正在使用带有pandas(0.19.1)的anaconda python 2.7.12.
import os
import glob
import pandas as pd
src_files = glob.glob(os.path.join('/my/path', "*.csv.gz"))
# 1 - Takes 2 min to read 20m records from 30 files
for file_ in sorted(src_files):
stage = pd.DataFrame()
iter_csv = pd.read_csv(file_
, sep=','
, index_col=False
, header=0
, low_memory=False
, iterator=True
, chunksize=100000
, compression='gzip'
, memory_map=True
, encoding='utf-8')
df = pd.concat([chunk for chunk in iter_csv])
stage = stage.append(df, ignore_index=True)
# 2 - Takes 55 min to write 20m records from one dataframe
stage.to_csv('output.csv'
, sep='|'
, header=True
, index=False
, chunksize=100000
, encoding='utf-8')
del stage
Run Code Online (Sandbox Code Playgroud)
我已经确认硬件和内存正在运行,但这些是相当宽的表(~100列),主要是数字(十进制)数据.
谢谢,
小智 8
你说“ [...] 主要是数字(十进制)数据。 ”。你有时间和/或日期的列吗?
当它只有数字/字符串值时,我在几秒钟内保存了一个 8 GB CSV,但需要 20 分钟才能保存一个 500 MB 的两Dates列CSV 。所以,我建议在保存之前将每个日期列转换为字符串。以下命令就足够了:
df['Column'] = df['Column'].astype(str)
Run Code Online (Sandbox Code Playgroud)
我希望这个答案对你有帮助。
PS:我知道保存为.hdf文件解决了这个问题。但是,有时,我们确实需要一个.csv文件。
您正在读取压缩文件并编写纯文本文件.可能是IO瓶颈.
编写压缩文件可以加速写入10倍
stage.to_csv('output.csv.gz'
, sep='|'
, header=True
, index=False
, chunksize=100000
, compression='gzip'
, encoding='utf-8')
Run Code Online (Sandbox Code Playgroud)
此外,您可以尝试不同的块大小和压缩方法('bz2','xz').
由于'gzip'替代方法对我不起作用,因此添加了一点见识-尝试使用to_hdf方法。这大大减少了写入时间!(对于100MB的文件,不到一秒钟的时间-CSV选项在30-55秒之间执行了此操作)
stage.to_hdf(r'path/file.h5', key='stage', mode='w')
Run Code Online (Sandbox Code Playgroud)