将Django QuerySet转换为Pandas Dataframe并保持列顺序

7

假设有一个像下面这样的Django queryset:

qs = A.objects.all().values_list('A', 'B', 'C', 'D', 'E', 'F')

我可以轻松将我的qs转换为pandas数据框:
df = pd.DataFrame.from_records(qs.values('A', 'B', 'C', 'D', 'E', 'F'))

然而,列的顺序并未保留。在转换后,我需要立即指定新的列顺序,但我不清楚原因:

df = df.columns['B', 'F', 'C', 'E', 'D', 'A']

为什么会发生这种情况,我应该怎么做才能避免必须显式地设置数据框列?
3个回答

9

qs.values()方法将QuerySet对象转换为字典,但是字典是无序的。如果使用qs.values_list()方法则会返回一个由元组组成的列表。

建议尝试:

df = pd.DataFrame.from_records(
    A.objects.all().values_list('A', 'B', 'C', 'D', 'E', 'F')
)

请查看关于Django的QuerySets的文档


4

尝试:

df = pd.DataFrame.from_records("DATA_GOES_HERE", columns=['A','B','C'.. etc.) 

我正在使用columns=参数,该参数可以在此处找到。我相信您也可以通过使用pd.DataFrame来构建DataFrame,并将您的列表与相应的列名放入其中。虽然这可能需要更多的手动操作,但如果这是一个自动化作业,它也可以工作。(可能会再次出现排序问题,但可以通过重新排列列来轻松解决..再次提醒,前期可能需要更多的工作)

0

上述答案需要手动添加列。但是,这可以被规避。我编写了一个更简单的版本,不需要列名:

def django_recordset_to_data_frame(django_recordset):
    mydf = pd.DataFrame.from_records(django_recordset.values_list())
    mydf.columns = [col for col in django_recordset[0].__dict__.keys()][1:]
    return mydf

例如,您可以像下面这样使用它来处理您的News表:

django_recordset = News.objects.all()
panda_data_frame = django_recordset_to_data_frame(django_recordset )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接