将 Django QuerySet 转换为 Pandas 数据帧并保持列顺序



给定如下所示的 Django 查询集:

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

我可以轻松地将我的qs转换为熊猫数据帧:

df = pd.DataFrame.from_records(qs.values('A', 'B', 'C', 'D', 'E', 'F'))

但是,不维护列顺序。转换后,我需要立即指定列的新顺序,但不清楚为什么:

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

为什么会发生这种情况,我可以采取哪些不同的措施来避免必须显式设置数据帧列?

qs.values()

QuerySet 转换为无序字典。你可以使用 qs.values_list() ,它会返回元组列表。

尝试:

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

查看有关 Django 的 QuerySet 的文档

尝试:

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

我正在使用此处找到的columns=参数。

我相信你也可以通过使用pd来构造数据帧。数据帧,并将您的列表与相应的列名放在其中。这可能是更多的手动工作,但如果这是自动化作业,它也可以工作。(这里可能再次遇到排序问题,但可以通过重新排列列轻松解决。同样,可能需要预先做更多的工作(

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

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 )

最新更新