[Python] What is the fastest way to output large DataFrame into a CSV file?

Discussão em 'Python' iniciado por Stack, Junho 19, 2025.

  1. Stack

    Stack Membro Participativo

    For python / pandas I find that df.to_csv(fname) works at a speed of ~1 mln rows per min. I can sometimes improve performance by a factor of 7 like this:

    def df2csv(df,fname,myformats=[],sep=','):
    """
    # function is faster than to_csv
    # 7 times faster for numbers if formats are specified,
    # 2 times faster for strings.
    # Note - be careful. It doesn't add quotes and doesn't check
    # for quotes or separators inside elements
    # We've seen output time going down from 45 min to 6 min
    # on a simple numeric 4-col dataframe with 45 million rows.
    """
    if len(df.columns) <= 0:
    return
    Nd = len(df.columns)
    Nd_1 = Nd - 1
    formats = myformats[:] # take a copy to modify it
    Nf = len(formats)
    # make sure we have formats for all columns
    if Nf < Nd:
    for ii in range(Nf,Nd):
    coltype = df[df.columns[ii]].dtype
    ff = '%s'
    if coltype == np.int64:
    ff = '%d'
    elif coltype == np.float64:
    ff = '%f'
    formats.append(ff)
    fh=open(fname,'w')
    fh.write(','.join(df.columns) + '\n')
    for row in df.itertuples(index=False):
    ss = ''
    for ii in xrange(Nd):
    ss += formats[ii] % row[ii]
    if ii < Nd_1:
    ss += sep
    fh.write(ss+'\n')
    fh.close()

    aa=DataFrame({'A':range(1000000)})
    aa['B'] = aa.A + 1.0
    aa['C'] = aa.A + 2.0
    aa['D'] = aa.A + 3.0

    timeit -r1 -n1 aa.to_csv('junk1') # 52.9 sec
    timeit -r1 -n1 df2csv(aa,'junk3',myformats=['%d','%.1f','%.1f','%.1f']) # 7.5 sec


    Note: the increase in performance depends on dtypes. But it is always true (at least in my tests) that to_csv() performs much slower than non-optimized python.

    If I have a 45 million rows csv file, then:

    aa = read_csv(infile) # 1.5 min
    aa.to_csv(outfile) # 45 min
    df2csv(aa,...) # ~6 min


    Questions:

    • What are the ways to make the output even faster?
    • What's wrong with to_csv() ? Why is it soooo slow ?

    Note: my tests were done using pandas 0.9.1 on a local drive on a Linux server.

    Continue reading...

Compartilhe esta Página