【问题标题】:Consider last group with groupby使用 groupby 考虑最后一组
【发布时间】:2019-12-11 14:52:27
【问题描述】:

我只是想进一步了解grouper。我知道调用frequency 会使某些功能无效。但我想知道在使用grouper 时是否可以计算最后一段。例如,我希望 max 计数包含 13:30:00 and 13:45:00 之间的 15 分钟段,用于下面的 df

df = pd.DataFrame({
    'Time' : ['1904-01-01 13:00:00','1904-01-01 13:10:00','1904-01-01 13:15:00','1904-01-01 13:25:00','1904-01-01 13:35:00'],                 
    'Number' : [2,2,1,1,1],                      
    })

df['Time'] = pd.to_datetime(df['Time'])

df = df.groupby(pd.Grouper(freq='15T', key='Time', closed = 'left'))['Number'].max().ffill()
df = df.reset_index(level=['Time'])

输出:

                 Time  Number
0 1904-01-01 13:00:00       2
1 1904-01-01 13:15:00       1
2 1904-01-01 13:30:00       1

这可以通过使用label = 'right' 来实现。但输出是:

                 Time  Number
0 1904-01-01 13:15:00       2
1 1904-01-01 13:30:00       1
2 1904-01-01 13:45:00       1

我希望返回df

                 Time  Number
0 1904-01-01 13:00:00       2
1 1904-01-01 13:15:00       1
2 1904-01-01 13:30:00       1
3 1904-01-01 13:45:00       1

【问题讨论】:

    标签: pandas group-by


    【解决方案1】:

    我在 pandas 0.24.2 中得到不同的输出:

    df = df.groupby(pd.Grouper(freq='15T', key='Time', closed = 'right'))['Number'].max().ffill()
    df = df.reset_index(level=['Time'])
    print (df)
                     Time  Number
    0 1904-01-01 12:45:00       2
    1 1904-01-01 13:00:00       2
    2 1904-01-01 13:15:00       1
    3 1904-01-01 13:30:00       1
    

    标签可以移动label='right',但值不会改变:

    df = (df.groupby(pd.Grouper(freq='15T', key='Time', label='right', closed = 'right'))['Number']
           .max().ffill())
    
    #resample alternative
    df2 = df.resample('15T', on='Time', label='right', closed='right')['Number'].max().ffill()
    df2 = df.reset_index(level=['Time'])
    print (df2)
                     Time  Number
    0 1904-01-01 13:00:00       2
    1 1904-01-01 13:15:00       2
    2 1904-01-01 13:30:00       1
    3 1904-01-01 13:45:00       1
    

    更多信息请参见how to understand closed and label arguments in pandas resample method?,因为Grouper 使用相同的逻辑并且大多数参数是相同的。

    您的问题的可能解决方案是添加新行,将最大日期时间偏移15 Min

    df1 = pd.DataFrame({'Time': df['Time'].max() + pd.Timedelta('15T'),
                        'Number':df['Number'].iat[-1]}, index=[0])
    print (df1)
                     Time  Number
    0 1904-01-01 13:50:00       1
    
    df = df.append(df1).groupby(pd.Grouper(freq='15T', key='Time'))['Number'].max()
    df = df.reset_index(level=['Time'])
    
    print (df)
                     Time  Number
    0 1904-01-01 13:00:00       2
    1 1904-01-01 13:15:00       1
    2 1904-01-01 13:30:00       1
    3 1904-01-01 13:45:00       1
    

    【讨论】:

    • 谢谢@jezrael。我确实考虑在 df 末尾添加一个新行。我只是不知道我是否缺少可以执行相同任务的功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-03-05
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 2020-06-08
    相关资源
    最近更新 更多