Mik*_*eyE 6 python-2.7 pandas peewee
使用PeeWee ORM我有以下查询:
query = DataModel.select()where(DataModel.field == "value")
Run Code Online (Sandbox Code Playgroud)
有没有办法转换query成pandas DataFrame而不迭代所有的值?我正在寻找一种更"Pythonic"的方式来做到这一点.
Gre*_*eda 18
假设query是类型peewee.SelectQuery,你可以这样做:
df = pd.DataFrame(list(query.dicts()))
Run Code Online (Sandbox Code Playgroud)
小智 6
以防万一有人发现这很有用,我正在寻找相同的转换,但在Python 3中。受到@toto_tico之前的回答的启发,这就是我想出的:
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)
Run Code Online (Sandbox Code Playgroud)
使用Python 3.9.6和pandas==1.3.2进行检查。peewee==3.14.4peewee.SqliteDatabase
以下是一种更有效的方法,因为它避免了创建列表然后将其传递给熊猫数据框。它还具有保留列顺序的附带好处:
df = pd.read_sql(query.sql()[0], database.connection())
Run Code Online (Sandbox Code Playgroud)
你需要直接访问 peewee database,例如在快速入门教程中对应:
db = SqliteDatabase('people.db')
Run Code Online (Sandbox Code Playgroud)
当然,您也可以创建自己的数据库连接。
缺点:如果你在两个表中有重复的列,你应该小心,例如id列会出现两次。所以在继续之前一定要纠正这些。
如果您使用的是 peewee 代理 import peewee as pw; database_proxy = pw.Proxy(),则连接在这里:
database_proxy.obj.connection()
Run Code Online (Sandbox Code Playgroud)