如何将django QuerySet转换为numpy记录数组?
PS:我知道你可以迭代并构建它,但还有其他更清洁的解决方案吗?
答案 0 :(得分:14)
import numpy as np
qs = MyModel.objects.all()
vlqs = qs.values_list()
r = np.core.records.fromrecords(vlqs, names=[f.name for f in MyModel._meta.fields])
它直接使用QuerySet迭代器,避免了创建python列表的浪费时间和浪费的步骤。它还使用MyModel._meta.fields从模型中获取实际字段名称,如Get model's fields in Django中所述
如果您只想将一个字段(例如模型的“投票”字段)提取到一维数组中,您可以这样做:
vlqs = qs.values_list('votes', flat=True)
votes = np.fromiter(vlqs, numpy.dtype('int_'))
答案 1 :(得分:5)
这就像问“如何将冰箱的内容转换成晚餐?”。这取决于你的冰箱里有什么,以及你想吃什么。简短的回答(相当于说“通过烹饪”)是迭代查询集,构建您想要实例化数组的任何复合数据类型的对象(通常是可迭代的和字典)。答案很长取决于你真正想要完成的事情。
答案 2 :(得分:2)
如果你想获取所有对象并创建一个带有对象作为数组元素的numpy数组:
import numpy as np
qs = MyModel.objects.all()
numpy_array = np.array(list(qs))
根据我的工作,我使用如下的东西:
import numpy as np
qs = MyModel.objects.values_list('id','first_name','last_name').filter(gender='male').order_by('id')
numpy_array = np.array(list(qs))
数组的行对应于记录,数组的列对应于我在上面定义的值(id,名字,姓氏)。
答案 3 :(得分:1)
我在寻找:
来自QuerySet qs get vlqs(django.db.models.query.ValuesListQuerySet)
vlqs = qs.values_list()
将vlqs隐藏到列表
mylist = list(vlqs)
创建numpy记录数组
r = np.core.records.array(mylist,names ='field1,field2,field3')//名称是模型字段
答案 4 :(得分:1)
你能做的是:
[index[0] for index in qs.values_list('votes')]
并准备好...... XD
答案 5 :(得分:1)
并将它放入一个简洁的小函数,你只需要传递任何Django Queryset:
import pandas as pd
import numpy as np
def qs_to_df(qs):
""" QuerySet to DataFrame """
Model = qs.model
np_array = np.core.records.fromrecords(qs.values_list(), names=[f.name for f in Model._meta.fields])
return pd.DataFrame(np_array)
答案 6 :(得分:0)
关于@CpILL的回答你可以将大多数查询集转换为numpy记录数组,如下所示:
def qs_to_ra(qs, *args):
"""
Turn most querysets directly into a numpy record array
:param qs: django queryset
:param args: takes a list of field names to specify
:return: numpy.recarray
"""
model = qs.model
if args:
return np.core.records.fromrecords(qs.values_list(*args), names=args)
return np.core.records.fromrecords(qs.values_list(), names=[f.name for f in model._meta.fields])
您也可以将它们直接转换为pandas数据框,如下所示:
def qs_to_df(qs, *args):
"""
Turn most querysets directly into a pandas dataframe.
:param qs: django queryset
:param args: takes a list of field names to specify
:return: pandas.DataFrame
"""
model = qs.model
if args:
return pd.DataFrame.from_records(list(qs.values_list(*args)), columns=args)
return pd.DataFrame.from_records(list(qs.values_list()), columns=[f.name for f in model._meta.fields])