【问题标题】:Pandas dataframe: How to sort groups by the earliest time of a group熊猫数据框:如何按组的最早时间对组进行排序
【发布时间】:2021-09-15 21:08:47
【问题描述】:

是否有解决以下问题的 pandas 方法?有一个包含许多列的数据框,包括“时间”和“事件ID”。首先,我想按“eventid”对数据框进行分组。每个“eventid”可能与多个“时间”相关联。然后我需要按每个组的最早“时间”对“eventid”组进行排序(组内的顺序并不重要)。比如我的输入是这样的:

eventid time
1 9:10
2 9:20
1 9:30
3 9:40
3 9:50
2 9:00

我想要的输出是这样的:

eventid time
2 9:00
2 9:20
1 9:30
1 9:10
3 9:50
3 9:40

我尝试过df.sort_values(by=['time','eventid'])df.groupby,但在这种情况下可能是错误的。另一种方法是按“时间”排序,然后查询并重写数据框。但是由于原始数据很大,所以需要花费太多时间。

我之前找不到类似的问题。非常感谢您提供可能的解决方案。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    我们可以通过 eventid 进行分组,并将第一次(分钟)时间作为组值。
    会得到这样的数据

                time
    eventid 
    1           9:10
    2           9:00
    3           9:40
    

    然后我们合并到dataframe,并按分组时间排序

    groups = df.groupby('eventid').min('time')
    df = df.merge(groups,on='eventid',suffixes=('','_right'))
    df = df.sort_values('time_right')
    
        eventid time    time_right
    2   2       9:20    9:00
    3   2       9:00    9:00
    0   1       9:10    9:10
    1   1       9:30    9:10
    4   3       9:40    9:40
    5   3       9:50    9:40
    

    【讨论】:

    • 非常感谢!这些代码确实有效。但是,我的“时间”列具有日期时间类型,因此 df.min() 函数仍然存在一些问题。我想我可以解决它。
    【解决方案2】:

    试试这个:

    df.sort_values(['time'],ascending=True).groupby('event_id')
    

    此代码首先对时间列的值进行排序,然后根据“event_id”对数据帧进行分组。它仅在时间列的范围从一个时间戳到“n”个时间戳时才有效。如果每个“event_id”中都有一个最小时间戳,我认为用户@nay的答案是正确的。

    【讨论】:

    • 感谢您提供答案。您能否编辑您的答案以包括对您的代码的解释?这将有助于未来的读者更好地了解正在发生的事情,尤其是那些刚接触该语言并难以理解概念的社区成员。
    • 是的肯定...我会从这里开始...我没有尝试代码但由于问题相对容易认为答案会起作用,无论如何OP说@nay的答案是工作正常。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2023-03-16
    相关资源
    最近更新 更多