2009-11-16 79 views

回答

1

我一直在尋找:

  1. 從查詢集QS得到vlqs(django.db.models.query.ValuesListQuerySet)

    vlqs = qs.values_list()

  2. 隱蔽vlqs列出

    MYLIST =列表(vlqs)

  3. 創建numpy的記錄陣列

    R = np.core.records.array(MYLIST,名稱= 'FIELD1,FIELD2,字段3')//名稱是模型字段

6

這就像問「我如何將冰箱的內容轉換成晚餐?」。這取決於你的冰箱裏有什麼,以及你想吃什麼。簡短的回答(相當於說「通過烹飪」)是迭代查詢集,構建任何你想實例化數組的對象(通常是一個迭代和一個字典)。長的答案取決於你想要達到的目標。

+5

嗯... ...晚餐 – 2009-11-16 11:21:31

+2

感謝您的諮詢!但我不會爲這個明顯的答案發布這個問題:)。 – Vishal 2009-11-16 19:31:23

11
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

這是一個很好的例子!其他窺視:請注意flat = True非常重要,以便values_list中的值是簡單的值而不是元組:https://docs.djangoproject.com/en/1.8/ref/models/querysets/#values-list – 2015-09-19 17:23:14

1

你可以做的是:

[index[0] for index in qs.values_list('votes')] 

,並準備... XD

+0

請問指數[0]在做什麼? – 2015-09-19 17:24:47

1

如果你想要讓所有的對象和CRE的吃得對象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,名字,姓氏)。

1

並把它變成一個整潔的小功能,您只需通過任何Django的查詢集:

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) 
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]) 

您也可以將它們直接進入熊貓數據幀像這樣:

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])