django中使用pandas,将queryset转化为dataframe,Django-pandas

在django中使用pandas操作django的ORM查询出来的QuerySet对象,可以使用插件django-pandas。

截止教程书写时间,django-pandas已发布到0.6.1。

依赖:django>=1.4.5

Django-model-utils >=1.4.0

Pandas >=0.12.0

当然,还需要numpy

用法:

1、IO模块:

该django-pandas.io模块提供了一些方便的方法,以便从django的查询集转换成DataFrames的创建。

read_frame

参数:

l   qs :一个django的QuerySet。

l   fieldnames :用于创建DataFrame的模型字段名称列表。可以使用双下划线指定另一个model中的相关字段,以通常的Django方式跨越关系。

l   index_col:使用指定用于DataFrame索引的字段名称。如果索引字段不在fieldnames参数中,则将会添加,注意这里的字段必须为该model里的字段。

l   coerce_float:Boolean(布尔值),默认为True。尝试将值转换为非字符串,将非数字对象(如decimal.Decimal)转化为浮点类型。

Eg:

model.py

class Img_info(models.Model):
    ‘‘‘
    图片信息表
    ‘‘‘
    img_name = models.CharField(max_length=128, verbose_name="图片名")
    img = models.ImageField(upload_to="img", verbose_name="图片")

    class Meta:
        db_table = "img_info"

class Product_score(models.Model):
    ‘‘‘
    图片打分表
    ‘‘‘
    img_of = models.ForeignKey(Img_info, on_delete=models.CASCADE, verbose_name="图片")
    scoring_staff = models.CharField(max_length=32, verbose_name="打分员")
    score_num = models.FloatField(verbose_name="分数")

    class Meta:
        db_table = "product_score"

views.py

1、直接转化

from django_pandas.io import read_frame

def tset(request):
    qs = Product_score.objects.all()
    qs_dataframe = read_frame(qs=qs)
    print(qs_dataframe)
    return HttpResponse(‘ok‘)

运行结果:

    id               img_of scoring_staff  score_num
0   15  Img_info object (5)           测试1       22.0
1   16  Img_info object (6)           测试1       23.0
2   17  Img_info object (7)           测试1       24.0
3   18  Img_info object (8)           测试1       25.0
4   19  Img_info object (9)           测试1       26.0
5   20  Img_info object (5)           测试2       22.0
6   21  Img_info object (6)           测试2       23.0
7   22  Img_info object (7)           测试2       24.0
8   23  Img_info object (8)           测试2       25.0
9   24  Img_info object (9)           测试2       26.0
10  25  Img_info object (5)           测试3       22.0
11  26  Img_info object (6)           测试3       23.0
12  27  Img_info object (7)           测试3       24.0
13  28  Img_info object (8)           测试3       25.0

2、跨关联表显示

views.py

from django_pandas.io import read_frame

def tset(request):
    qs = Product_score.objects.all()
    qs_dataframe = read_frame(qs=qs,fieldnames=[‘img_of__img_name‘, ‘scoring_staff‘, ‘score_num‘])
    print(qs_dataframe)
    return HttpResponse(‘ok‘)

运行结果:

   img_of__img_name scoring_staff  score_num
0               士大夫           测试1       22.0
1               士大夫           测试2       22.0
2               士大夫           测试3       22.0
3               54撒           测试1       23.0
4               54撒           测试2       23.0
5               54撒           测试3       23.0
6               撒旦撒           测试1       24.0
7               撒旦撒           测试2       24.0
8               撒旦撒           测试3       24.0
9              撒旦撒2           测试1       25.0
10             撒旦撒2           测试2       25.0
11             撒旦撒2           测试3       25.0
12               24           测试1       26.0
13               24           测试2       26.0

3、指定索引

views.py

def tset(request):
    qs = Product_score.objects.all()
    qs_dataframe = read_frame(qs=qs,fieldnames=[‘img_of__img_name‘, ‘scoring_staff‘, ‘score_num‘],index_col=‘id‘)
    print(qs_dataframe)
    return HttpResponse(‘ok‘)

运行结果:

   img_of__img_name scoring_staff  score_num
id
15              士大夫           测试1       22.0
20              士大夫           测试2       22.0
25              士大夫           测试3       22.0
16              54撒           测试1       23.0
21              54撒           测试2       23.0
26              54撒           测试3       23.0
17              撒旦撒           测试1       24.0
22              撒旦撒           测试2       24.0
27              撒旦撒           测试3       24.0
18             撒旦撒2           测试1       25.0
23             撒旦撒2           测试2       25.0
28             撒旦撒2           测试3       25.0
19               24           测试1       26.0
24               24           测试2       26.0

2、DataFrameManager

django-pandas提供了一个自定义管理器,可用于要呈现为pandas Dataframes的模型。该DataFrameManager管理器提供to_dataframe返回你模型查询集(queryset )为pandas的DataFrame。要使用DataFrameManager,首先覆盖model定义中的默认管理器(objects)。

这将使您可以访问以下QuerySet方法:

l   to_dataframe  从QuerySet返回DataFrame

l   to_timeserie  用于创建时间序列的便捷方法,即DataFrame索引是DateTime或PeriodIndex的实例

l   to_pivot_table 从QuerySet创建数据透视表的便捷方法

to_dataframe

l   fieldnames :用于创建DataFrame的模型字段名称列表。可以使用双下划线指定另一个model中的相关字段,以通常的Django方式跨越关系。

l   index:使用指定用于DataFrame索引的字段名称。如果索引字段不在fieldnames参数中,则将会添加,注意这里的字段必须为该model里的字段。

l   coerce_float:Boolean(布尔值),默认为True。尝试将值转换为非字符串,将非数字对象(如decimal.Decimal)转化为浮点类型。

eg:

models.py

class Img_info(models.Model):
    ‘‘‘
    图片信息表
    ‘‘‘
    img_name = models.CharField(max_length=128, verbose_name="图片名")
    img = models.ImageField(upload_to="img", verbose_name="图片")

    class Meta:
        db_table = "img_info"

class Product_score(models.Model):
    ‘‘‘
    图片打分表
    ‘‘‘
    img_of = models.ForeignKey(Img_info, on_delete=models.CASCADE, verbose_name="图片")
    scoring_staff = models.CharField(max_length=32, verbose_name="打分员")
    score_num = models.FloatField(verbose_name="分数")
    objects = DataFrameManager()

    class Meta:
        db_table = "product_score"

views.py

def tset(request):
    qs = Product_score.objects.all()
    qs_dataframe = qs.to_dataframe(fieldnames=[‘img_of__img_name‘, ‘scoring_staff‘, ‘score_num‘], index=‘id‘, coerce_float=True)
    print(qs_dataframe)
    return HttpResponse(‘ok‘)

运行结果:

   img_of__img_name scoring_staff  score_num
id
15              士大夫           测试1       22.0
20              士大夫           测试2       22.0
25              士大夫           测试3       22.0
16              54撒           测试1       23.0
21              54撒           测试2       23.0
26              54撒           测试3       23.0
17              撒旦撒           测试1       24.0
22              撒旦撒           测试2       24.0
27              撒旦撒           测试3       24.0
18             撒旦撒2           测试1       25.0
23             撒旦撒2           测试2       25.0
28             撒旦撒2           测试3       25.0
19               24           测试1       26.0
24               24           测试2       26.0

您可以使用过滤器和排除:

筛选出分数大于23的

views.py

def tset(request):
    qs = Product_score.objects.all()
    qs_dataframe = qs.filter(score_num__gt=23).to_dataframe(fieldnames=[‘img_of__img_name‘, ‘scoring_staff‘, ‘score_num‘], index=‘id‘, coerce_float=True)
    print(qs_dataframe)
    return HttpResponse(‘ok‘)

运行结果:

   img_of__img_name scoring_staff  score_num
id
17              撒旦撒           测试1       24.0
18             撒旦撒2           测试1       25.0
19               24           测试1       26.0
22              撒旦撒           测试2       24.0
23             撒旦撒2           测试2       25.0
24               24           测试2       26.0
27              撒旦撒           测试3       24.0
28             撒旦撒2           测试3       25.0

to_pivot_table

  • fieldnames:用于创建DataFrame的模型字段名称列表。可以使用双下划线指定另一个model中的相关字段,以通常的Django方式跨越关系。
  • values:要聚合的列,可选
  • rows : 要分组的列名称或数组的列表,在数据透视表的x轴上分组的键
  • cols : 要分组的列名称或数组的列表,在数据透视表的y轴上分组的键
  • aggfunc : function,默认numpy.mean或函数列表,如果传递的函数列表,生成的数据透视表将具有分层列,其顶层是函数名称(从函数对象本身推断)
  • fill_value : 标量,默认无,用于替换缺失值的值
  • margin : boolean,默认为False,添加所有行/列(例如,对于小计/总计)
  • dropna:布尔值,默认为True,去除NaN值

views.py

def tset(request):
    qs = Product_score.objects.all()
    data_df_to_pivot_table = qs.to_pivot_table(
        values=‘score_num‘, rows=[‘img_of__img_name‘], cols=[‘scoring_staff‘], fieldnames=[‘img_of__img_name‘, ‘scoring_staff‘, ‘score_num‘], margins=True)
    print(data_df_to_pivot_table)
    return HttpResponse(‘ok‘)

运行结果:

scoring_staff      测试1   测试2   测试3        All
img_of__img_name
24                26.0  26.0   NaN  26.000000
54撒               23.0  23.0  23.0  23.000000
士大夫               22.0  22.0  22.0  22.000000
撒旦撒               24.0  24.0  24.0  24.000000
撒旦撒2              25.0  25.0  25.0  25.000000
All               24.0  24.0  23.5  23.857143

原文地址:https://www.cnblogs.com/xshan/p/11343100.html

时间: 2024-07-31 14:50:58

django中使用pandas,将queryset转化为dataframe,Django-pandas的相关文章

django中使用Profile扩展User模块(基于django 1.10版本下)

版本:Django 1.10.1(其他版本可能有不同的实现好解决办法) 参考官方文档:https://docs.djangoproject.com/en/1.10/topics/auth/customizing/ 在开发过程中,Django的用户管理模块能够给我们带来非常大的便利,但是Django的User模块所提供的字段太少,所以对User模块的扩展是必须的,下面结合我自己的开发过程中,使用Profile扩展User模块时遇到的问题以及解决的方法进行记录. 先看一段我根据官方文档最先开发完成的

Django中ORM外键和表的关系(Django编程-4)

外键 在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam.如果使用的是InnoDB引擎,是支持外键约束的.外键的存在使得ORM框架在处理表关系的时候异常的强大.因此这里我们首先来介绍下外键在Django中的使用. 类定义为class ForeignKey(to,on_delete,**options).第一个参数是引用的是哪个模型,第二个参数是在使用外键引用的模型数据被删除了,这个字段该如何处理,比如有CASCADE.SET_NULL等.这里以一个实际案例来说明.比如有一个

Django中的Model(操作表)

一.基本操作 1 # 增 2 3 models.Tb1.objects.create(c1='xx', c2='oo') #增加一条数据,可以接受字典类型数据 **kwargs 4 5 obj = models.Tb1(c1='xx', c2='oo') 6 obj.save() 7 dic = {'c1':'xx','c2':'oo'} models.Tb1.objects.create(**dic) #Form的产出结果是一个字典,可以根据这个Form的字典和**直接在数据库创建数据 8 #

Django中的form表单

1,手写一个form表单提交数据 有input标签,让用户可以填数据 校验form表单提数据 提示错误信息 html页面代码: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>注册</title> </head> <body> <h1>form表单中的注册<

vue与django中预防CSRF

一.环境: vue2.0.django 1.10.x.iview 二.django后台处理 1.将django的setting的MIDDLEWARE中加入django.middleware.csrf.CsrfViewMiddleware,一般新建的django项目中会自带的. 1 MIDDLEWARE = [ 2 'django.middleware.security.SecurityMiddleware', 3 'django.contrib.sessions.middleware.Sessi

{Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session

本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 xxx 八 xxx 一 会话跟踪 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而10086服务人员就是服务器了.从双方接通电话那一刻起,会话就开始了,到某一方挂断电话表示会话结束.在通话过程中,你会向10086发出多个请求,那么这多个请

Django——Django中的QuerySet API 与ORM(对象关系映射)

首先名词解释. ORM: 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”. 面向对象是从软件工程基本原则(如耦合.聚合.封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别.为了解决这个不匹配的现象,对象关系映射技术应运而生. 对象关系映射(Obj

django中models和forms阅读笔记

一.使用数据库需要设置settings.py文件. DATABASES = { 'default': { 'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 'NAME': '', # Or path to database file if using sqlite3. 'USER': '', # Not used with sqlite3. 'PASSWORD

django中的ORM系统

数据库的配置 1    django默认支持sqlite,mysql, oracle,postgresql数据库.  <1> sqlite django默认使用sqlite的数据库,默认自带sqlite的数据库驱动 , 引擎名称:django.db.backends.sqlite3 <2> mysql 引擎名称:django.db.backends.mysql 2    mysql驱动程序 MySQLdb(mysql python) mysqlclient MySQL PyMySQ