【问题标题】:SQLite to Pandas - speedSQLite 到 Pandas - 速度
【发布时间】:2021-08-03 12:29:09
【问题描述】:

我最近从使用 SAS 切换到 Python。我想用 Python 做一些 SQL 查询。我按如下方式进行操作(table1 和 table2 是 pandas 数据框):

import pandas as pd
import sqlite3
sql = sqlite3.connect(':memory:')
c = sql.cursor()

table1.to_sql('table1sql', sql, if_exists='replace', index=False)
table2.to_sql('table2sql', sql, if_exists='replace', index=False)

df_sql = c.execute('''
                      SELECT a.*, b.*
                      FROM table1sql as a
                      LEFT JOIN table2sql as b
                      ON a.id = b.id

                      ''')

df = pd.DataFrame(df_sql.fetchall())
df.columns = list(map(lambda x: x[0], c.description)) # get column names from sql cursor

我使用非常大的数据集。有时多达 60 次 mio 观察。查询本身需要几秒钟。但是,“获取”数据集,即将 sql 数据帧转换为 pandas 数据帧,需要很长时间。

在 SAS 中,整个 SQL 查询需要几秒钟的时间。我这样做的方式效率低吗?有没有其他方法可以做我想做的事情?

【问题讨论】:

    标签: python sql sqlite


    【解决方案1】:
    import pandas as pd
    import sqlite3
    
    # Connect to sqlite3 instance
    con = sqlite3.connect(':memory:')
    
    # Read sqlite query results into a pandas DataFrame
    df = pd.read_sql_query('''
        SELECT a.*, b.*
        FROM table1sql as a
        LEFT JOIN table2sql as b
        ON a.id = b.id
      ''',
      con
    )
    
    # Verify that result of SQL query is stored in the dataframe
    print(df.head())
    
    con.close()
    

    文档:https://pandas.pydata.org/docs/reference/api/pandas.read_sql_query.html?highlight=read%20sql%20query#pandas.read_sql_query

    编辑

    等等,我刚刚重新阅读了你的问题,来源已经是 pandas 数据帧???

    您为什么要将它们推送到 SQLite,只是为了再次读取它们?只需使用pd.merge()

    df = pd.merge(
        table1,
        table2,
        how="left",
        on="id",
        suffixes=("_x", "_y"),
        copy=True
    )
    

    文档:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.merge.html#pandas.merge

    【讨论】:

    • 谢谢,我会试试这个。但是,这更快的原因是什么?
    • @shenflow - 在您的数据库中查询数据库并将结果放入内存,然后将结果复制到另一个内存位置(pandas 数据框),然后再次解析并复制它们以分配列名。以上内容不会在内存中发送垃圾副本。
    • 关于你的问题:我做了相当复杂的 SQL 合并,我不知道如何在 pandas 中复制。
    • @shenflow - 那么你应该问如何使用 pandas 来完成你目前不知道如何做的事情。将 60M 行进出 SQLite 和 Pandas 是疯狂的。使用 SAS、SQLite 或 Pandas,不要为了避免学习语法而在它们之间移动数据。学习 Pandas(这里有很多人会帮助你)或者不使用 Pandas,但是我在 SQL 中没有什么是我在 Pandas 中无法做到的。 (另请注意,SAS 被构建为能够利用多个 cpu 内核,但 Python 不是。)
    • Pandas 希望您为它格式化和排序数据,因为它没有与 SQL 或 SAS 完全相同的索引。如果您想询问有关如何在 Pandas 中加速特定用例的问题,请在新的 StackOverflow 问题中将其作为具体示例。如果您认为 Pandas 不是处理数据的合适环境,那么问题来了,您为什么要使用 Pandas。但是,将数百万行数据移入和移出 SQLite 似乎毫无意义。这现在变成了讨论和培训练习,这不是 SO 的用途。
    猜你喜欢
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 2012-03-14
    相关资源
    最近更新 更多