给定下面的pandas DataFrame:
In [115]: times = pd.to_datetime(pd.Series(['2014-08-25 21:00:00','2014-08-25 21:04:00',
'2014-08-25 22:07:00','2014-08-25 22:09:00']))
locations = ['HK', 'LDN', 'LDN', 'LDN']
event = ['foo', 'bar', 'baz', 'qux']
df = pd.DataFrame({'Location': locations,
'Event': event}, index=times)
df
Out[115]:
Event Location
2014-08-25 21:00:00 foo HK
2014-08-25 21:04:00 bar LDN
2014-08-25 22:07:00 baz LDN
2014-08-25 22:09:00 qux LDN
我想对数据进行重新采样,以每小时按计数聚合,同时按位置分组,以生成如下所示的 Dataframe :
Out[115]:
HK LDN
2014-08-25 21:00:00 1 1
2014-08-25 22:00:00 0 2
我尝试过reample()和groupby()的各种组合,但都没有成功。我该怎么办?
6条答案
按热度按时间dfuffjeb1#
在我最初的帖子中,我建议使用
pd.TimeGrouper
。现在,使用pd.Grouper
代替pd.TimeGrouper
。语法基本相同,但TimeGrouper
is now deprecated更倾向于pd.Grouper
。此外,虽然
pd.TimeGrouper
只能按DatetimeIndex分组,但pd.Grouper
可以按datetime columns 分组,您可以通过key
参数指定。您可以使用
pd.Grouper
按小时对DatetimeIndex的DataFrame进行分组:使用
count
计算每个组中的事件数:使用
unstack
将Location
索引级别移动到列级别:然后使用
fillna
将NaN变为零。综合起来,
产量
soat7uwm2#
Pandas0.21回答:TimeGrouper is getting deprecated
有两个选项可以这样做。他们实际上可以根据你的数据给出不同的结果。第一个选项按位置分组,在位置内按小时分组。第二个选项同时按位置和小时分组。
groupby + resample
groupby(pd.Grouper)
组合在一起这两种方法都将导致以下结果:
然后重塑:
将输出
iyfjxgzm3#
多列分组依据
untubu的回答是正确的,但我想补充一下,如果你有第三列,比如
Cost
,并想像上面那样聚合它,你可以做什么。正是通过结合unutbu的答案和this one,我发现了如何做到这一点,并认为我会分享给未来的用户。创建一个包含
Cost
列的DataFrame:现在,我们使用
agg
函数指定每个列的聚合方法进行分组,例如:计数、平均数、总和等然后最后的
unstack
用零填充NaN
并显示为int
,因为它很漂亮。5uzkadbs4#
如果要保留所有列
ngynwnxp5#
这可以在不使用
resample
或Grouper
的情况下完成,如下所示:df.groupby([df.index.floor("1H"), "Location"]).count()
pokxtpni6#
pd.resample
>>>pd.groupby()
似乎快了很多倍