[英]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.