多级索引中的Groupby时间仓

时间:2019-08-06 14:07:49

标签: python pandas pandas-groupby

我有一个像这样的稀疏填充的数据框:

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分钟窗口内发生的值进行分组,以便我可以取均值在各列之间,本质上无视datetime索引的分钟部分。

我曾尝试使用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列的平均值。

1 个答案:

答案 0 :(得分:2)

解决方案需要DatetimeIndex,因此首先将另一个级别转换为列,然后将其添加到groupby中的list中:

通知:平均值是按组而不是按列。

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)