如何将SQL查询结果转换为PANDAS数据结构?

任何关于这个问题的帮助将不胜感激。 所以基本上我想运行一个查询到我的SQL数据库,并将返回的数据存储为Pandas数据结构。 我附上查询代码。 我读pandas的文档,但我有问题,以确定我的查询的返回types。 我试图打印查询结果,但它没有提供任何有用的信息。 谢谢!!!!

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) 

所以我有点想知道我的variables“resoverall”的格式/数据types是什么,以及如何把它与PANDAS数据结构。

以下是可以完成这项工作的最短代码:

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

你可以去看看保罗的答案,也可以分析这些types。

编辑:2015年3月

如下所述,pandas现在使用SQLAlchemy从( read_sql )读取并插入( to_sql )数据库。 以下应该工作

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

以前的回答:通过mikebmassey从类似的问题

 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() 

如果您使用的是SQLAlchemy的ORM而不是expression式语言,那么您可能希望将sqlalchemy.orm.query.Querytypes的对象转换为Pandas数据框架。

最简洁的方法是从查询的语句属性中获取生成的SQL,然后使用pandas的read_sql()方法执行它。 例如,从一个名为query的Query对象开始:

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

PS请注意,我原来的答案是使用下面的代码。 它工作,但有点丑陋:

 data_records = [rec.__dict__ for rec in query.all()] df = pandas.DataFrame.from_records(data_records) 

编辑2014-09-30:

pandas现在有一个read_sql函数。 你一定要用它来代替。

原始答案:

我无法帮助您使用SQLAlchemy – 我总是根据需要使用pyodbc,MySQLdb或psychopg2。 但是当这样做的时候,像下面那样简单的function就可以满足我的需求:

 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 

像Nathan一样,我经常想将sqlalchemy或sqlsoup Query的结果转储到Pandas数据框中。 我自己的解决scheme是:

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

resoverall是一个sqlalchemy ResultProxy对象。 您可以在sqlalchemy文档中阅读更多关于它的信息,后者解释了使用引擎和连接的基本用法。 重要的是, resoverall是字典像。

pandas喜欢像对象字典来创build其数据结构,看到在线文档

祝你好运。

这个问题很老,但是我想加两分钱。 我把这个问题看成是“我想运行一个查询到我的SQL数据库,并将返回的数据存储为Pandas数据结构[DataFrame]”。

从代码看起来像你的意思是MySQL数据库,并假设你的意思是pandasDataFrame。

 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) 

例如,

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

这会将testTable的所有行导入到DataFrame中。

一起使用pandaspyodbc 。 你将不得不根据你的数据库规范修改你的连接string( connstr )。

 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)) 

我用pyodbc与几个企业数据库(例如SQL Server,MySQL,MariaDB,IBM)。

很长一段时间,从最后一篇文章,但也许​​它有助

比保罗短缺的方式H:

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

最好的办法,我这样做

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

这是我的。 以防万一,如果你使用“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 

如果结果types是ResultSet ,则应先将其转换为字典。 然后DataFrame列将被自动收集。

这适用于我的情况:

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

MySQL连接器

对于那些使用mysql连接器的人,你可以使用这段代码作为开始。 (感谢@Daniel Velkov)

二手参考:

  • 使用连接器/ Python查询数据
  • 使用Python连接到MYSQL三个步骤

 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())