python - Django ORM 获取字段的最大值和对应的其他列值

标签 python django pandas

我有一个数据框:

`exp_no`   'time'   'price'

  1       0:00:00     20.0
  1       7 days      45.0
  1       15 days     100.0
  2       0:00:00     20.0
  2       7 days      45.0
  2       15 days     100.0

对应的Django模型:

class StData(models.Model):
      exp_no = models.ForeignKey(StIndex, on_delete=models.CASCADE)
      time = models.DateTimeField()
      price = models.DecimalField(max_digits=10, decimal_places=2)   

我想制作一个较小的表格,其中包含 exp_no、max_time 和相应的价格,这样:

 `exp_no`   'time'   'price'

  1       15 days     100.0
  2       15 days     100.0

在 pandas 中,我会做 df.groupby('exp_no')['time', 'price'].max().reset_index() 以获得所需的表。

如果我这样做,在 Django ORM 注释中获得相同的结果(或查询集):

qs.values('exp_no').annotate(max_time=Max('time')).order_by()

它给了我 exp_no 和时间,但我也想得到相应的价格。我已经在 SO 中查看了这个答案:Django orm get latest for each group

但不确定我是如何获得价格的。将 Django 2.0 与 sqlite3 结合使用。

我很感激任何帮助。

最佳答案

您的问题归结为获取具有最大 time 列的记录的 StData 对象(或值)。所以我们不需要聚合,而是获取相对于 time 列的最小或最大行。

获取最大时间StData对象

您可以在'time'点餐时获取last()行,例如:

stdata_max_time = qs<b>.order_by('time').last()</b>  # will return a StData

或者:

stdata_max_time = qs<b>.order_by('-time').first()</b>  # will return a StData

如果 time 可以为 NULL(此处不适用),您可以通过指定在排序时将这些行放在第一位来确保您不会检索带有 NULL 的行/last 元素分别为:

from django.db.models import F

# two alternatives
stdata_max_time = qs.order_by(<b>F('time', nulls_first=True)</b>).last()
stdata_max_time = qs.order_by(<b>F('-time', nulls_last=True)</b>).first()

因此这是一个 StData 对象,因此您可以从该对象中检索所需的所有相关信息。由于它是一个 StData 对象,它的行为也会像这样(因此您定义的额外属性、方法等也将起作用)。

获取最大时间

的值

这完全相似,除了我们在查询中放置了一个 .values(..) 调用:

stdata_max_time = qs.order_by('time')<b>.values('exp_no', 'time', 'price')</b>.last()

但除非有一些真正充分的理由,否则我个人更愿意获取 StData 对象,因为这意味着“包含电池”(你得到了所有你想要的逻辑使用该对象写入 StData 类)。

关于python - Django ORM 获取字段的最大值和对应的其他列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52543124/

相关文章:

python - 如何在 python 中根据索引绘制图形

python - 如何将单个条件应用于数据框中的列列表并将值添加到第四列而不使用多个 OR

python - 在Python中使用sql将一行合并在一列中

python - 如何使用 Python 和 Selenium Webdriver 使用 mat-options 查找下拉列表的长度?

python - Django错误: TypeError: int() argument must be a string or a number,而不是 'BuildsTable'

python - 为一个条目分配多个标签

python - Groupby 多索引 pandas 系列使用 agg 求和并应用列表

python - 通过固定第一个元素自定义排序列表

python - 是否可以在 Django 项目之外更改 'migrations' 文件夹的位置?

python - django-bootstrap3 python包安装: no files found matching '*.png' under directory 'bootstrap3'