【问题标题】:Convert list of pyodbc.rows to pandas Dataframe takes very long time将 pyodbc.rows 列表转换为 pandas Dataframe 需要很长时间
【发布时间】:2018-11-26 17:16:39
【问题描述】:

有没有更快的方法将 pyodbc.rows 对象转换为 pandas Dataframe?将超过 1000 万个 pyodbc.rows 对象的列表转换为 pandas 数据帧大约需要 30-40 分钟。

import pyodbc
import pandas

server = <server_ip> 
database = <db_name> 
username = <db_user> 
password = <password> 
port='1443'

conn = pyodbc.connect('DRIVER={SQL Server};SERVER='+server+';PORT='+port+';DATABASE='+database+';UID='+username+';PWD='+ password)

#takes upto 12 minutes
rows = cursor.execute("select top 10000000 * from [LSLTGT].[MBR_DIM] ").fetchall() 

#Read cursor data into Pandas dataframe.....Takes forever!
df = pandas.DataFrame([tuple(t) for t in rows]) 

【问题讨论】:

  • 如果你会使用 sqlalchemy,你可以看看 pandas.read_sql (pandas.pydata.org/pandas-docs/stable/generated/…)
  • @Owen 那是我的上一期。我尝试使用 pandas.read_sql 并且读取所有数据需要很长时间。请参阅link 我正在尝试找到一种更快的方法将数据从 SQL 服务器加载到 Pandas Dataframe Just Once,然后我计划将 df 存储为羽毛格式以便后续更快地读取。
  • 在 Management Studio 中执行该查询需要多长时间?我的猜测是 pandas 不是这里的问题。
  • @Owen - 在 SSMS 上读取 1000 万条记录需要 8:25 分钟。
  • SSMS 是否与您的 python 代码在同一台机器上运行?

标签: python pandas pyodbc


【解决方案1】:

使用生成器表达式而不是列表推导式可能会得到一些改进:

df = pandas.DataFrame((tuple(t) for t in rows)) 

【讨论】:

    【解决方案2】:

    还有一个选项可以直接使用 pandas 执行此操作:

    df = pd.DataFrame.from_records(rows, columns=[col[0] for col in cursor.description])
    

    【讨论】:

      猜你喜欢
      • 2017-08-15
      • 1970-01-01
      • 1970-01-01
      • 2018-10-16
      • 2018-10-09
      • 2018-06-17
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      相关资源
      最近更新 更多