¿Cómo transformar el dataframe de pandas para su inserción a través de la sentencia executemany ()?

Tengo un dataframe - 50 pandas bastante grande dataframe - 50 o menos dataframe - 50 encabezados y unos cientos de miles de filas de datos) y estoy buscando transferir estos datos a una base de datos utilizando el módulo ceODBC . Anteriormente estaba usando pyodbc y usando una simple sentencia de ejecución en un bucle for, pero esto estaba tomando una longitud ridículamente larga (1000 registros por 10 minutos) …

Ahora estoy probando un nuevo módulo y estoy intentando introducir executemany() aunque no estoy muy seguro de lo que significa la secuencia de parámetros en:

  cursor.executemany("""insert into table.name(a, b, c, d, e, f) values(?, ?, ?, ?, ?), sequence_of_parameters) 

Si se ve como una lista constante que trabaja a través de cada encabezado

  ['asdas', '1', '2014-12-01', 'true', 'asdasd', 'asdas', '2', '2014-12-02', 'true', 'asfasd', 'asdfs', '3', '2014-12-03', 'false', 'asdasd'] 
  • donde este es un ejemplo de tres filas

¿O cuál es el formato que se necesita?

como otra pregunta relacionada, ¿cómo puedo entonces convertir un dataframe de pandas normal a este formato?

¡Gracias!

Puedes probar esto:

 cursor.executemany(sql_str, your_dataframe.values.tolist()) 

Espero eso ayude.

Me las arreglé para resolver esto al final. Entonces, si tienes un Data Frame de Pandas que deseas escribir en una base de datos usando ceODBC que es el módulo que usé, el código es:

(con all_data como el dataframe) asigna los valores del dataframe a la cadena y almacena cada fila como una tupla en una lista de tuplas

 for r in all_data.columns.values: all_data[r] = all_data[r].map(str) all_data[r] = all_data[r].map(str.strip) tuples = [tuple(x) for x in all_data.values] 

para la lista de tuplas, cambie todos los significantes de valor nulo, que se han capturado como cadenas en la conversión anterior, en un tipo nulo que se puede pasar a la base de datos final. Esto fue un problema para mí, podría no ser para ti.

 string_list = ['NaT', 'nan', 'NaN', 'None'] def remove_wrong_nulls(x): for r in range(len(x)): for i,e in enumerate(tuples): for j,k in enumerate(e): if k == x[r]: temp=list(tuples[i]) temp[j]=None tuples[i]=tuple(temp) remove_wrong_nulls(string_list) 

crear una conexión a la base de datos

 cnxn=ceODBC.connect('DRIVER={SOMEODBCDRIVER};DBCName=XXXXXXXXXXX;UID=XXXXXXX;PWD=XXXXXXX;QUIETMODE=YES;', autocommit=False) cursor = cnxn.cursor() 

defina una función para convertir la lista de tuplas en una lista new_list que es una indexación adicional en la lista de tuplas, en trozos de 1000. Esto fue necesario para que yo pasara los datos a la base de datos cuya consulta SQL no podía exceder 1 MB.

 def chunks(l, n): n = max(1, n) return [l[i:i + n] for i in range(0, len(l), n)] new_list = chunks(tuples, 1000) 

define tu consulta

 query = """insert into XXXXXXXXXXXX("XXXXXXXXXX", "XXXXXXXXX", "XXXXXXXXXXX") values(?,?,?)""" 

Ejecute la lista new_list contiene la lista de tuplas en grupos de 1000 y realice la executemany . Sigue esto comprometiendo y cerrando la conexión y eso es todo 🙂

 for i in range(len(new_list)): cursor.executemany(query, new_list[i]) cnxn.commit() cnxn.close() 

Puede que sea un poco tarde para responder a esta pregunta, pero quizás todavía pueda ayudar a alguien. executemany() no es implementado por muchos ODBC. Uno de los que sí lo tiene es MySQL . Cuando se refieren a la secuencia de parámetros significan:

 parameters=[{'name':'Jorge', 'age':22, 'sex':'M'}, {'name':'Karen', 'age':25, 'sex':'F'}, {'name':'James', 'age':29, 'sex':'M'}] 

y para una statement de consulta se vería algo así como:

 SQL = INSERT IGNORE INTO WORKERS (NAME, AGE, SEX) VALUES (%(name)s, %(age)s, %(sex)s) 

Lo que parece que tienes allí. Sin embargo, quiero señalar un par de cosas en caso de que ayuden: pandas tiene una función to_sql que se inserta en una base de datos si le proporciona el objeto conector, y también divide los datos.

Para crear rápidamente una secuencia de parámetros a partir de un dataframe de pandas, encontré los siguientes dos métodos útiles:

 # creates list of dict, list of parameters # REF: https://groups.google.com/forum/#!topic/pydata/qna3Z3WmVpM parameters = [df.iloc[line, :].to_dict() for line in range(len(df))] # Cleaner Way parameters = df.to_dict(orient='records')