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

2025-03-04 08:25:00
admin
原创
58
摘要:问题描述:任何关于此问题的帮助都将不胜感激。所以基本上我想对我的 SQL 数据库运行查询并将返回的数据存储为 Pandas 数据结构。我已附加查询代码。我正在阅读有关 Pandas 的文档,但在识别查询的返回类型时遇到了问题。我尝试打印查询结果,但它没有提供任何有用的信息。谢谢!!!!from sqlalch...

问题描述:

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

所以基本上我想对我的 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 数据结构放在一起。


解决方案 1:

这是可以完成这个任务的最短的代码:

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

您可以更加仔细地分析类型,就像 Paul 的回答中那样。

解决方案 2:

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

解决方案 3:

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

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

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

解决方案 4:

1.使用 MySQL-connector-python

# pip install mysql-connector-python

import mysql.connector
import pandas as pd

mydb = mysql.connector.connect(
    host = 'host',
    user = 'username',
    passwd = 'pass',
    database = 'db_name'
)
query = 'select * from table_name'
df = pd.read_sql(query, con = mydb)
print(df)

2.使用 SQLAlchemy

# pip install pymysql
# pip install sqlalchemy

import pandas as pd
import sqlalchemy

engine = sqlalchemy.create_engine('mysql+pymysql://username:password@localhost:3306/db_name')

query = '''
select * from table_name
'''
df = pd.read_sql_query(query, engine)
print(df)

解决方案 5:

编辑2014-09-30:

pandas 现在有一个read_sql函数。你肯定想使用它。

原始答案:

我无法帮助您使用 SQLAlchemy——我总是根据需要使用 pyodbc、MySQLdb 或 psychopg2。但是,当这样做时,像下面这样简单的函数往往能满足我的需求:

import decimal

import pyodbc #just corrected a typo here
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

解决方案 6:

MySQL 连接器

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

使用过的参考文献:

  • 使用 Connector/Python 查询数据

  • 使用 Python 连接 MYSQL 只需 3 步


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

解决方案 7:

这是我使用的代码。希望对您有所帮助。

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)

解决方案 8:

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

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)

解决方案 9:

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

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

解决方案 10:

resoverall是一个 sqlalchemy ResultProxy 对象。你可以在sqlalchemy 文档中阅读更多内容,后者解释了使用引擎和连接的基本用法。这里重要的是它resoverall类似于字典。

Pandas 喜欢使用类似字典的对象来创建其数据结构,请参阅在线文档

祝您使用 sqlalchemy 和 pandas 好运。

解决方案 11:

只需将pandaspyodbc一起使用即可。您必须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)。

解决方案 12:

这个问题很老了,但我想补充一下我的看法。我把这个问题理解为“我想对我的 [my]SQL 数据库运行查询,并将返回的数据存储为 Pandas 数据结构 [DataFrame]。”

从代码来看,您的意思是 mysql 数据库,并且假设您的意思是 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)

例如,

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

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

解决方案 13:

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

解决方案 14:

pandas.io.sql.write_frame 已弃用。https
://pandas.pydata.org/pandas-docs/version/0.15.2/generated/pandas.io.sql.write_frame.html

应更改为使用 pandas.DataFrame.to_sql
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html

还有另一种解决方案。PYODBC
到 Pandas - DataFrame 不起作用 - 传递值的形状为 (x,y),索引暗示 (w,z)

从 Pandas 0.12 开始(我相信),你可以这样做:

import pandas
import pyodbc

sql = 'select * from table'
cnn = pyodbc.connect(...)

data = pandas.read_sql(sql, cnn)

在 0.12 之前,你可以执行以下操作:

import pandas
from pandas.io.sql import read_frame
import pyodbc

sql = 'select * from table'
cnn = pyodbc.connect(...)

data = read_frame(sql, cnn)

解决方案 15:

距离上次发帖已经过去很久了,但也许它可以对某些人有所帮助......

比 Paul H 更短的方式:

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

解决方案 16:

我这样做的最好方法

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

解决方案 17:

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

这对我的情况有用:

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

解决方案 18:

这是一个我喜欢的简单解决方案:

将您的数据库连接信息放在安全位置的 YAML 文件中(不要在代码库中进行版本控制)。

---
host: 'hostname'
port: port_number_integer
database: 'databasename'
user: 'username'
password: 'password'

然后将 conf 加载到字典中,打开数据库连接并将 SQL 查询的结果集加载到数据框中:

import yaml
import pymysql
import pandas as pd

db_conf_path = '/path/to/db-conf.yaml'

# Load DB conf
with open(db_conf_path) as db_conf_file:
    db_conf = yaml.safe_load(db_conf_file)

# Connect to the DB
db_connection = pymysql.connect(**db_conf)

# Load the data into a DF
query = '''
SELECT *
FROM my_table
LIMIT 10
'''

df = pd.read_sql(query, con=db_connection)
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2757  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1693  
  在全球化的浪潮下,企业的业务范围不断拓展,跨文化协作变得愈发普遍。不同文化背景的团队成员在合作过程中,由于语言、价值观、工作习惯等方面的差异,往往会面临诸多沟通挑战。而产品生命周期管理(PLM)系统作为企业管理产品全生命周期的重要工具,如何有效支持跨文化协作成为了关键问题。通过合理运用沟通策略,PLM系统能够在跨文化团...
plm是什么软件   15  
  PLM(产品生命周期管理)系统在企业的产品研发、生产与管理过程中扮演着至关重要的角色,其中文档版本控制是确保产品数据准确性、完整性和可追溯性的关键环节。有效的文档版本控制能够避免因版本混乱导致的错误、重复工作以及沟通不畅等问题,提升企业整体的运营效率和产品质量。接下来,我们将深入探讨 PLM 系统实现文档版本控制的 6...
plm是什么意思   19  
  PLM(产品生命周期管理)项目管理旨在通过有效整合流程、数据和人员,优化产品从概念到退役的整个生命周期。在这个过程中,敏捷测试成为确保产品质量、加速交付的关键环节。敏捷测试强调快速反馈、持续改进以及与开发的紧密协作,对传统的测试流程提出了新的挑战与机遇。通过对测试流程的优化,能够更好地适应PLM项目的动态变化,提升产品...
plm管理系统   18  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用