Python Pandas – Usar to_sql para escribir grandes marcos de datos en trozos

Estoy usando la función to_sql Pandas para escribir en MySQL, que se está to_sql debido al gran tamaño del marco (1M filas, 20 columnas).

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_sql.html

¿Hay una forma más oficial de dividir los datos y escribir filas en bloques? He escrito mi propio código, que parece funcionar. Aunque preferiría una solución oficial. ¡Gracias!

 def write_to_db(engine, frame, table_name, chunk_size): start_index = 0 end_index = chunk_size if chunk_size < len(frame) else len(frame) frame = frame.where(pd.notnull(frame), None) if_exists_param = 'replace' while start_index != end_index: print "Writing rows %s through %s" % (start_index, end_index) frame.iloc[start_index:end_index, :].to_sql(con=engine, name=table_name, if_exists=if_exists_param) if_exists_param = 'append' start_index = min(start_index + chunk_size, len(frame)) end_index = min(end_index + chunk_size, len(frame)) engine = sqlalchemy.create_engine('mysql://...') #database details omited write_to_db(engine, frame, 'retail_pendingcustomers', 20000) 

Actualización: esta funcionalidad se ha fusionado en pandas master y se lanzará en 0.15 (probablemente a finales de septiembre), gracias a @artemyk. Ver https://github.com/pydata/pandas/pull/8062

Así que a partir de 0.15, puede especificar el argumento chunksize y, por ejemplo, simplemente hacer:

 df.to_sql('table', engine, chunksize=20000) 

Hay una gran cantidad de funciones idiomáticas proporcionadas en respuesta a esta pregunta

En tu caso puedes usar esta función así:

 def chunks(l, n): """ Yield successive n-sized chunks from l. """ for i in xrange(0, len(l), n): yield l.iloc[i:i+n] def write_to_db(engine, frame, table_name, chunk_size): for idx, chunk in enumerate(chunks(frame, chunk_size)): if idx == 0: if_exists_param = 'replace': else: if_exists_param = 'append' chunk.to_sql(con=engine, name=table_name, if_exists=if_exists_param) 

El único inconveniente es que no admite el corte del segundo índice en la función iloc.