我有一个像这样的稀疏填充的数据框:
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
列的平均值。
答案 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)