如何将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.Query
types的对象转换为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中。
一起使用pandas
和pyodbc
。 你将不得不根据你的数据库规范修改你的连接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())