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

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

任何有关此问题的帮助将不胜感激。

所以基本上我想对我的SQL数据库运行查询并将返回的数据存储为Pandas数据结构。

我附加了查询代码。

我正在阅读关于Pandas的文档,但是我有问题确定我的查询的返回类型。

我试图打印查询结果,但它没有提供任何有用的信息。

谢谢!!!!

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)

所以我想知道我的变量“resoverall”的格式/数据类型是什么,以及如何使用PANDAS数据结构。

15个解决方案

97 votes

编辑: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()

beardc answered 2019-05-29T19:31:43Z

79 votes

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

from pandas import DataFrame

df = DataFrame(resoverall.fetchall())

df.columns = resoverall.keys()

你可以像保罗的回答一样更好地解析这些类型。

Daniel Velkov answered 2019-05-29T19:31:06Z

29 votes

如果您使用的是SQLAlchemy的ORM而不是表达式语言,您可能会发现自己想要将类型为read_sql()的对象转换为Pandas数据框。

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

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

Nathan Gould answered 2019-05-29T19:32:15Z

20 votes

编辑2014-09-30:

熊猫现在有一个read_sql功能。 你肯定想要使用它。

原始答案:

我无法帮助你使用SQLAlchemy - 我总是根据需要使用pyodbc,MySQLdb或psychopg2。 但是当这样做时,一个像下面那样简单的功能可以满足我的需求:

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

Paul H answered 2019-05-29T19:32:54Z

4 votes

与Nathan一样,我经常想将sqlalchemy或sqlsoup查询的结果转储到Pandas数据框中。 我自己的解决方案是:

query = session.query(tbl.Field1, tbl.Field2)

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

Janak Mayer answered 2019-05-29T19:33:18Z

4 votes

MySQL连接器

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

使用的参考:

使用Connector / Python查询数据

使用Python以3个步骤连接到MYSQL

import pandas as pd

import mysql.connector

# Setup MySQL connection

db = mysql.connector.connect(

host="", # your host, usually localhost

user="", # your username

password="", # your password

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

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

Thomas Devoogdt answered 2019-05-29T19:34:03Z

4 votes

这是我使用的代码。 希望这可以帮助。

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)

Murali Bala answered 2019-05-29T19:34:27Z

3 votes

resoverall是sqlalchemy ResultProxy对象。 您可以在sqlalchemy文档中阅读有关它的更多信息,后者解释了使用Engines和Connections的基本用法。 这里重要的是resoverall就像这样。

Pandas喜欢像对象一样创建数据结构,请参阅在线文档

祝你好运sqlalchemy和熊猫。

Wouter Overmeire answered 2019-05-29T19:35:05Z

3 votes

这个问题很老,但我想补充两分钱。 我把这个问题读作“我想对我的[my] SQL数据库运行查询,并将返回的数据存储为Pandas数据结构[DataFrame]。”

从代码看起来你的意思是mysql数据库,并假设你的意思是pandas DataFrame。

import MySQLdb as mdb

import pandas.io.sql as sql

from pandas import *

conn = mdb.connect('','','','');

df = sql.read_frame('', conn)

例如,

conn = mdb.connect('localhost','myname','mypass','testdb');

df = sql.read_frame('select * from testTable', conn)

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

joelotz answered 2019-05-29T19:35:45Z

3 votes

只需使用pyodbc和pyodbc。 您必须根据数据库规范修改连接字符串(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)。

openwonk answered 2019-05-29T19:36:17Z

2 votes

这是对您的问题的简短而清晰的答案:

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)

DeshDeep Singh answered 2019-05-29T19:36:42Z

1 votes

这是我的。 以防您使用“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

kennyut answered 2019-05-29T19:37:07Z

0 votes

很长一段时间从上一篇文章,但也许它有助于某人

比保罗H短道:

my_dic = session.query(query.all())

my_df = pandas.DataFrame.from_dict(my_dic)

Antonio Fernandez answered 2019-05-29T19:37:39Z

0 votes

最好的方式我这样做

db.execute(query) where db=db_class() #database class

mydata=[x for x in db.fetchall()]

df=pd.DataFrame(data=mydata)

Berto answered 2019-05-29T19:38:04Z

0 votes

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

这适用于我的情况:

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

tanza9 answered 2019-05-29T19:38:36Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值