将多个滚动函数应用于pandas groupby滚动对象的多个列?

3
我希望做以下事情:
1. 对数据框进行分组。 2. 对于每个分组,生成时间窗口(给定时间单位)。 3. 在生成的结构中,取每一列并应用多个滚动摘要统计函数,以便结果具有每个组/时间窗口组合的摘要统计信息。
这是一个示例数据集:
gps_time,name,val_x,val_y
2017-07-04 11:20:23.423,bob,0.963,0.201
2017-07-04 11:20:24.492,bob,0.964,0.203
2017-07-04 11:20:24.499,bob,0.962,0.210
2017-07-04 11:20:25.627,sarah,0.893,0.010
2017-07-04 11:20:28.627,sarah,0.894,0.012
2017-07-04 11:20:29.613,sarah,0.895,0.014
2017-07-04 11:20:29.630,larry,-0.423,0.231
2017-07-04 11:20:30.423,larry,-0.431,0.22
2017-07-04 11:20:30.428,larry,-0.432,0.222

将上述数据按名称分组,并使用1秒的时间窗口生成所需输出:

name,gps_time,val_x_mean,val_x_med,val_y_mean,val_y_med
bob,2017-07-04 11:20:23.423,0.963,0.963,0.201,0.201
bob,2017-07-04 11:20:24.492,0.963,0.963,0.2065,0.2065
sarah,2017-07-04 11:20:25.627,0.893,0.89,0.010,0.010
sarah,2017-07-04 11:20:28.627,0.8945,0.8945,0.013,0.013
larry,2017-07-04 11:20:30.423,-0.4287,-0.431,0.336,0.222

我尝试使用列表推导式生成一堆数据框,但这个过程非常缓慢,而且我必须为每一列都调用它。

1个回答

5

让我们使用pd.Grouper来进行groupby

df_out = df.groupby([pd.Grouper(freq='S', key='gps_time'),'name']).agg(['mean','median'])
df_out.columns = df_out.columns.map('_'.join)
df_out.reset_index()

输出:

             gps_time   name  val_x_mean  val_x_median  val_y_mean  \
0 2017-07-04 11:20:23    bob      0.9630        0.9630      0.2010   
1 2017-07-04 11:20:24    bob      0.9630        0.9630      0.2065   
2 2017-07-04 11:20:25  sarah      0.8930        0.8930      0.0100   
3 2017-07-04 11:20:28  sarah      0.8940        0.8940      0.0120   
4 2017-07-04 11:20:29  larry     -0.4230       -0.4230      0.2310   
5 2017-07-04 11:20:29  sarah      0.8950        0.8950      0.0140   
6 2017-07-04 11:20:30  larry     -0.4315       -0.4315      0.2210   

   val_y_median  
0        0.2010  
1        0.2065  
2        0.0100  
3        0.0120  
4        0.2310  
5        0.0140  
6        0.2210  

这太完美了!我如何指定跨间隔的特定百分比重叠? - Brandon Sherman
请解释一下重叠百分比,我该如何计算它? - Scott Boston
50%的重叠意味着在给定两个间隔时,第k个间隔的后50%是第(k+1)个间隔的前50%。例如,如果我们有列表[1,2,3,4,5,6,7,8],则使用4个观测窗口生成50%重叠的间隔将得到[1,2,3,4],[3,4,5,6],[5,6,7,8]。 - Brandon Sherman
@BrandonSherman 这听起来像是你需要一个滚动函数。你介意创建一个新问题,包括输入和期望输出吗? - Scott Boston
没问题!由于我的示例没有重叠,我将从问题中删除有关重叠的提及并创建一个新问题。 - Brandon Sherman
刚做好了。https://stackoverflow.com/questions/45446671/applying-multiple-functions-to-multiple-columns-of-a-pandas-groupby-object-with - Brandon Sherman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接