【问题标题】:How to convert a select query into a pandas DataFrame using PeeWee如何使用 PeeWee 将选择查询转换为 pandas DataFrame
【发布时间】:2017-07-24 14:04:18
【问题描述】:

使用 PeeWee ORM 我有以下查询:

query = DataModel.select()where(DataModel.field == "value")

有没有什么方法可以将query 转换为 pandas DataFrame 而无需遍历所有值?我正在寻找一种更“Pythonic”的方式来做到这一点。

【问题讨论】:

    标签: python-2.7 pandas peewee


    【解决方案1】:

    假设query 的类型为peewee.SelectQuery,您可以这样做:

    df = pd.DataFrame(list(query.dicts()))
    

    编辑:正如 Nicola 在下面指出的,您现在可以直接使用 pd.DataFrame(query.dicts())

    【讨论】:

    • 非常简单,就像一个魅力!我不会告诉你我花了多长时间试图弄清楚那个,这很尴尬。大声笑
    • 由于某种原因list(query.dicts()) 会失败,如果有一列具有表的名称...有人遇到过同样的问题吗?
    • 不要使用list(),正确的代码是:pd.DataFrame(query.dicts())
    【解决方案2】:

    以下是一种更有效的方式,因为它避免了创建列表然后将其传递给 pandas 数据框。它还具有保持列顺序的附带好处:

    df = pd.read_sql(query.sql()[0], database.connection())
    

    你需要直接访问peeweedatabase,例如在quickstart tutorial对应:

    db = SqliteDatabase('people.db')
    

    当然,您也可以创建自己的数据库连接。

    缺点:如果您在两个表中有重复的列,您应该小心,例如id 列将出现两次。因此,请确保在继续之前更正这些错误。


    如果您使用 peewee 代理

    import peewee as pw; 
    database_proxy = pw.Proxy()
    

    那么连接就在这里:

    database_proxy.obj.connection()
    

    【讨论】:

    • 你如何处理query.sql()[0]返回一个以%s为占位符的字符串?
    • 我得看看你的确切查询,但通常这可能意味着存在格式字符串 python 语法,check this
    • @LivingSilver94 这不是一个完整的解决方案,但获取光标并使用 mogrify 适用于 postgres:cursor = db.cursor() 然后pd.read_sql(cursor.mogrify(*query.sql()), ...)
    【解决方案3】:

    以防万一有人觉得这很有用,我正在搜索相同的转换,但在 Python 3 中。受@toto_tico's previous answer 的启发,这是我想出的:

    import pandas
    import peewee
    
    
    def data_frame_from_peewee_query(query: peewee.Query) -> pandas.DataFrame:
        connection = query._database.connection()  # noqa
        sql, params = query.sql()
        return pandas.read_sql_query(sql, connection, params=params)
    

    Python 3.9.6pandas==1.3.2peewee==3.14.4 进行检查,使用 peewee.SqliteDatabase

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-28
      • 2017-09-20
      • 2013-05-25
      • 2022-09-29
      相关资源
      最近更新 更多