【发布时间】:2017-07-24 14:04:18
【问题描述】:
使用 PeeWee ORM 我有以下查询:
query = DataModel.select()where(DataModel.field == "value")
有没有什么方法可以将query 转换为 pandas DataFrame 而无需遍历所有值?我正在寻找一种更“Pythonic”的方式来做到这一点。
【问题讨论】:
标签: python-2.7 pandas peewee
使用 PeeWee ORM 我有以下查询:
query = DataModel.select()where(DataModel.field == "value")
有没有什么方法可以将query 转换为 pandas DataFrame 而无需遍历所有值?我正在寻找一种更“Pythonic”的方式来做到这一点。
【问题讨论】:
标签: python-2.7 pandas peewee
假设query 的类型为peewee.SelectQuery,您可以这样做:
df = pd.DataFrame(list(query.dicts()))
编辑:正如 Nicola 在下面指出的,您现在可以直接使用 pd.DataFrame(query.dicts())。
【讨论】:
list(query.dicts()) 会失败,如果有一列具有表的名称...有人遇到过同样的问题吗?
pd.DataFrame(query.dicts())
以下是一种更有效的方式,因为它避免了创建列表然后将其传递给 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为占位符的字符串?
cursor = db.cursor() 然后pd.read_sql(cursor.mogrify(*query.sql()), ...)
以防万一有人觉得这很有用,我正在搜索相同的转换,但在 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.6、pandas==1.3.2 和 peewee==3.14.4 进行检查,使用 peewee.SqliteDatabase。
【讨论】: