繁体   English   中英

返回按 N 个属性分组的最大值

[英]Returning Max value grouping by N attributes

我来自 Java 背景,并通过在我的工作环境中尽可能地应用它来学习 Python。 我有一段我非常想改进的功能代码。

本质上,我有一个带有 3 个数值和 1 个时间值的命名元组列表。

complete=[]
uniquecomplete=set()
screenedPartitions = namedtuple('screenedPartitions'['feedID','partition','date', 'screeeningMode'])

我解析了一个日志,并在它被填充后,我想创建一个缩减集,它本质上是最近日期的成员,其中 feedID、分区和筛选模式是相同的。 到目前为止,我只能通过使用讨厌的嵌套循环来解决它。

for a in complete:
    max = a             
    for b in complete:
        if a.feedID == b.feedID and a.partition == b.partition and\
                       a.screeeningMode == b.screeeningMode and a.date < b.date:
            max = b
    uniqueComplete.add(max)

任何人都可以就如何改进这一点给我建议吗? 使用 stdlib 中可用的内容来解决它会很棒,因为我想我在这里的主要任务是让我考虑使用地图/过滤器功能。

数据看起来类似于

FeedID | Partition | Date           | ScreeningMode

68     |    5      |10/04/2017 12:40|   EPEP

164    |    1      |09/04/2017 19:53|   ISCION

164    |    1      |09/04/2017 20:50|   ISCION

180    |    1      |10/04/2017 06:11|   ISAN

128    |    1      |09/04/2017 21:16|   ESAN

因此,在运行代码后,第 2 行将被删除,因为第 3 行是更新的版本。

Tl;Dr,这个 SQL 在 Python 中会是什么:

SELECT feedID,partition,screeeningMode,max(date)
from Complete
group by 'feedID','partition','screeeningMode'

尝试这样的事情:

import pandas as pd

df = pd.DataFrame(screenedPartitions, columns=screenedPartitions._fields)
df = df.groupby(['feedID','partition','screeeningMode']).max()

这实际上取决于您的日期是如何表示的,但是如果您提供数据,我认为我们可以解决一些问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM