【问题标题】:Groupby time bins in multilevel index多级索引中的 Groupby 时间箱
【发布时间】:2019-12-14 02:54:40
【问题描述】:

我有一个稀疏填充的数据框,如下所示:

entity_id                                                              59e75f2b9e182f68cf25721d  59e75f2bc0bd722a5f395ee9  59e75f2c05e40310ebe1f433  ... 
organisation_id          group_id                 datetime                                                                                           ... 
59e7515edb84e482acce8339 59e75177575fc94638c1f8e7 2018-04-01 02:01:00                       NaN                       NaN                       NaN  ... 
                                                  2018-04-01 02:02:00                       NaN                      2.15                       NaN  ... 
                                                  2018-04-01 02:03:00                       NaN                       NaN                     3.689  ... 
                                                  2018-04-01 02:04:00                       NaN                       NaN                       NaN  ... 
                                                  2018-04-01 02:05:00                       NaN                       NaN                       NaN  ... 
...                                                                                         ...                       ...                       ...  ... 
                         5cb590649f18c69541d34f7a 2019-04-01 01:55:00                       NaN                       NaN                       NaN  ... 
                                                  2019-04-01 01:56:00                       NaN                       NaN                       NaN  ... 
                                                  2019-04-01 01:57:00                       NaN                       NaN                       NaN  ... 
                                                  2019-04-01 01:58:00                       NaN                       NaN                       NaN  ... 
                                                  2019-04-01 01:59:00                       NaN                       NaN                       NaN  ... 

我想将此帧按group_id 和应用于日期时间索引的 10 分钟 bin 分组(对于每个组,我希望对同一 10 分钟窗口内发生的值进行分组,以便我可以对列取平均值,基本上忽略了日期时间索引的分钟部分)。

我尝试过使用pd.Grouper(freq='10T'),但它似乎无法与多级索引结合使用。

group_mean = frame.groupby(
    pd.Grouper(freq='10T'), level='datetime').mean(axis=1)

这给了我错误信息

TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'MultiIndex'

作为参考,我想要的输出应该如下所示:

                                                                      group_mean
organisation_id          group_id                 datetime                                                                                            
59e7515edb84e482acce8339 59e75177575fc94638c1f8e7 2018-04-01 02:10:00 mean(axis=1)                  
                                                  2018-04-01 02:20:00 mean(axis=1)                      
                                                  ...                       

                         5cb590649f18c69541d34f7a 2019-04-01 01:50:00 mean(axis=1)                      
                                                  2019-04-01 02:00:00 mean(axis=1)                      
                                                  ...                       

其中mean(axis=1) 是该特定组和时间箱中所有非NaN 列的平均值。

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    解决方案需要DatetimeIndex,所以先将另一个级别转换为列,并添加到list中的groupby

    注意:平均值是每组,而不是每列。

    group_mean = (frame.reset_index(['organisation_id','group_id'])
                       .groupby(['organisation_id',
                                 'group_id',
                                  pd.Grouper(freq='10T',level='datetime')])
                       .mean())
    

    如果需要每列的平均值:

    df = frame.mean(axis=1)
    

    【讨论】:

    • 我应该添加每列,每 10 分钟 bin 中只有一个值不能是 NaN。一旦我尝试过,我会接受它,但我认为这会奏效,谢谢!
    • @sobek - 也许最好在一些小数据中测试它,然后应用于大数据。
    • 我必须使用group_mean = frame.reset_index( ['organisation_id', 'group_id']).groupby( ['organisation_id', 'group_id', pd.Grouper( freq='10T', level='datetime')]).mean().mean(axis=1),但现在可以使用了,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 2016-11-15
    • 2016-03-04
    • 1970-01-01
    • 2020-12-17
    • 2021-01-28
    • 2015-11-23
    相关资源
    最近更新 更多