【问题标题】:Returning Max value grouping by N attributes按N个属性返回最大值分组
【发布时间】:2017-04-13 12:28:03
【问题描述】:

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

基本上我有一个包含 3 个数值和 1 个时间值的命名元组列表。

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

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

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;博士,这个 SQL 在 Python 中会是什么:

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

【问题讨论】:

    标签: python arrays group-by max namedtuple


    【解决方案1】:

    试试这样的:

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

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

    【讨论】:

    • 欢迎回复。日期是一个日期时间对象,datetime.datetime.strptime(stringDate, "%d/%m/%Y %H:%M:%S"),并在上面添加了示例。我看过 Pandas,但试图在 std Lib 中找到它。
    猜你喜欢
    • 2019-10-21
    • 2023-02-26
    • 2021-05-31
    • 2021-12-24
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    相关资源
    最近更新 更多