una seleccionar nueva insertar datos data crear columnas columna añadir agregar python mysql data-structures pandas

python - seleccionar - ¿Cómo convertir el resultado de la consulta SQL a la estructura de datos de PANDAS?



nueva columna pandas (15)

Conector MySQL

Para aquellos que trabajan con el conector mysql, puedes usar este código como inicio. (Gracias a @ Daniel Velkov)

Refs usados:

import pandas as pd import mysql.connector # Setup MySQL connection db = mysql.connector.connect( host="<IP>", # your host, usually localhost user="<USER>", # your username password="<PASS>", # your password database="<DATABASE>" # name of the data base ) # You must create a Cursor object. It will let you execute all the queries you need cur = db.cursor() # Use all the SQL you like cur.execute("SELECT * FROM <TABLE>") # Put it all to a data frame sql_data = pd.DataFrame(cur.fetchall()) sql_data.columns = cur.column_names # Close the session db.close() # Show the data print(sql_data.head())

Cualquier ayuda sobre este problema será muy apreciada.

Entonces, básicamente, quiero ejecutar una consulta en mi base de datos SQL y almacenar los datos devueltos como estructura de datos de Pandas.

He adjuntado el código para consulta.

Estoy leyendo la documentación sobre pandas, pero tengo problemas para identificar el tipo de devolución de mi consulta.

Traté de imprimir el resultado de la consulta, pero no proporciona ninguna información útil.

¡¡¡¡Gracias!!!!

from sqlalchemy import create_engine engine2 = create_engine(''mysql://THE DATABASE I AM ACCESSING'') connection2 = engine2.connect() dataid = 1022 resoverall = connection2.execute(" SELECT sum(BLABLA) AS BLA, sum(BLABLABLA2) AS BLABLABLA2, sum(SOME_INT) AS SOME_INT, sum(SOME_INT2) AS SOME_INT2, 100*sum(SOME_INT2)/sum(SOME_INT) AS ctr, sum(SOME_INT2)/sum(SOME_INT) AS cpc FROM daily_report_cooked WHERE campaign_id = ''%s''", %dataid)

Así que quiero entender cuál es el formato / tipo de datos de mi variable "resoverall" y cómo ponerlo con la estructura de datos de PANDAS.


Editar 2014-09-30:

pandas ahora tiene una función read_sql . Definitivamente quieres usar eso en su lugar.

Respuesta original:

No puedo ayudarte con SQLAlchemy. Siempre uso pyodbc, MySQLdb o psychopg2, según sea necesario. Pero al hacerlo, una función tan simple como la siguiente tiende a satisfacer mis necesidades:

import decimal import pydobc import numpy as np import pandas cnn, cur = myConnectToDBfunction() cmd = "SELECT * FROM myTable" cur.execute(cmd) dataframe = __processCursor(cur, dataframe=True) def __processCursor(cur, dataframe=False, index=None): '''''' Processes a database cursor with data on it into either a structured numpy array or a pandas dataframe. input: cur - a pyodbc cursor that has just received data dataframe - bool. if false, a numpy record array is returned if true, return a pandas dataframe index - list of column(s) to use as index in a pandas dataframe '''''' datatypes = [] colinfo = cur.description for col in colinfo: if col[1] == unicode: datatypes.append((col[0], ''U%d'' % col[3])) elif col[1] == str: datatypes.append((col[0], ''S%d'' % col[3])) elif col[1] in [float, decimal.Decimal]: datatypes.append((col[0], ''f4'')) elif col[1] == datetime.datetime: datatypes.append((col[0], ''O4'')) elif col[1] == int: datatypes.append((col[0], ''i4'')) data = [] for row in cur: data.append(tuple(row)) array = np.array(data, dtype=datatypes) if dataframe: output = pandas.DataFrame.from_records(array) if index is not None: output = output.set_index(index) else: output = array return output


Al igual que Nathan, a menudo quiero volcar los resultados de una consulta sqlalchemy o sqlsoup en un marco de datos de Pandas. Mi propia solución para esto es:

query = session.query(tbl.Field1, tbl.Field2) DataFrame(query.all(), columns=[column[''name''] for column in query.column_descriptions])


Aquí está el código más corto que hará el trabajo:

from pandas import DataFrame df = DataFrame(resoverall.fetchall()) df.columns = resoverall.keys()

Puede ir más elegante y analizar los tipos como en la respuesta de Paul.


Aquí está el código que uso. Espero que esto ayude.

import pandas as pd from sqlalchemy import create_engine def getData(): # Parameters ServerName = "my_server" Database = "my_db" UserPwd = "user:pwd" Driver = "driver=SQL Server Native Client 11.0" # Create the connection engine = create_engine(''mssql+pyodbc://'' + UserPwd + ''@'' + ServerName + ''/'' + Database + "?" + Driver) sql = "select * from mytable" df = pd.read_sql(sql, engine) return df df2 = getData() print(df2)


Aquí esta el mio. En caso de que esté utilizando "pymysql":

import pymysql from pandas import DataFrame host = ''localhost'' port = 3306 user = ''yourUserName'' passwd = ''yourPassword'' db = ''yourDatabase'' cnx = pymysql.connect(host=host, port=port, user=user, passwd=passwd, db=db) cur = cnx.cursor() query = """ SELECT * FROM yourTable LIMIT 10""" cur.execute(query) field_names = [i[0] for i in cur.description] get_data = [xx for xx in cur] cur.close() cnx.close() df = DataFrame(get_data) df.columns = field_names


Esta es una respuesta breve y nítida a su problema:

from __future__ import print_function import MySQLdb import numpy as np import pandas as pd import xlrd # Connecting to MySQL Database connection = MySQLdb.connect( host="hostname", port=0000, user="userID", passwd="password", db="table_documents", charset=''utf8'' ) print(connection) #getting data from database into a dataframe sql_for_df = ''select * from tabledata'' df_from_database = pd.read_sql(sql_for_df , connection)


Esta pregunta es antigua, pero quería agregar mis dos centavos. Leí la pregunta como "Quiero ejecutar una consulta a mi [mi] base de datos SQL y almacenar los datos devueltos como estructura de datos Pandas [DataFrame]".

Desde el código parece que te refieres a la base de datos mysql y asumes que te refieres a pandas DataFrame.

import MySQLdb as mdb import pandas.io.sql as sql from pandas import * conn = mdb.connect(''<server>'',''<user>'',''<pass>'',''<db>''); df = sql.read_frame(''<query>'', conn)

Por ejemplo,

conn = mdb.connect(''localhost'',''myname'',''mypass'',''testdb''); df = sql.read_frame(''select * from testTable'', conn)

Esto importará todas las filas de testTable en un DataFrame.


La mejor forma en que hago esto

db.execute(query) where db=db_class() #database class mydata=[x for x in db.fetchall()] df=pd.DataFrame(data=mydata)


Mucho tiempo desde la última publicación, pero tal vez ayuda a alguien ...

En corto camino que Paul H:

my_dic = session.query(query.all()) my_df = pandas.DataFrame.from_dict(my_dic)


Si el tipo de resultado es ResultSet , primero conviértalo en diccionario. Luego, las columnas de DataFrame se recopilarán automáticamente.

Esto funciona en mi caso:

df = pd.DataFrame([dict(r) for r in resoverall])


Si está utilizando el ORM de SQLAlchemy en lugar del lenguaje de expresión, es posible que desee convertir un objeto de tipo sqlalchemy.orm.query.Query en un marco de datos de Pandas.

El enfoque más limpio es obtener el SQL generado a partir del atributo de declaración de la consulta y luego ejecutarlo con el método read_sql() pandas. Por ejemplo, comenzando con un objeto de query llamado query :

df = pd.read_sql(query.statement, query.session.bind)


Simplemente usa pandas y pyodbc juntos. Tendrá que modificar su cadena de conexión ( connstr ) de acuerdo con las especificaciones de su base de datos.

import pyodbc import pandas as pd # MSSQL Connection String Example connstr = "Server=myServerAddress;Database=myDB;User Id=myUsername;Password=myPass;" # Query Database and Create DataFrame Using Results df = pd.read_sql("select * from myTable", pyodbc.connect(connstr))

He utilizado pyodbc con varias bases de datos empresariales (por ejemplo, SQL Server, MySQL, MariaDB, IBM).


resoverall es un objeto sqlalchemy ResultProxy. Puede leer más sobre esto en los documentos sqlalchemy , este último explica el uso básico de trabajar con motores y conexiones. Importante aquí es que resoverall es como dict.

A Pandas le gusta dict como objetos para crear sus estructuras de datos, mira los documentos en línea

Buena suerte con sqlalchemy y pandas.


Edición: marzo de 2015

Como se observa a continuación, pandas ahora usa SQLAlchemy para leer desde ( read_sql ) e insertar en ( to_sql ) una base de datos. Lo siguiente debería funcionar

import pandas as pd df = pd.read_sql(sql, cnxn)

Respuesta anterior: Via mikebmassey de una pregunta similar

import pyodbc import pandas.io.sql as psql cnxn = pyodbc.connect(connection_info) cursor = cnxn.cursor() sql = "SELECT * FROM TABLE" df = psql.frame_query(sql, cnxn) cnxn.close()