在pandas.groupBy中获取最大值的行,而不应用于具有DatetimeIndex的数据帧



我有一个带有DatetimeIndexpandas.Dataframe。数据每30分钟采样一次(可以不同(。我想每小时对数据重新采样一次,对于每个组,我想提取特定列上具有最高值的行。

例如

WindDir  WindSpeed  Temperature  CloudHgt
Date                                                          
2020-01-01 00:20:00    150.0        3.6          5.0     213.0
2020-01-01 00:50:00    150.0        3.1          5.0     213.0
2020-01-01 01:20:00    130.0        4.1          5.0     183.0
2020-01-01 01:50:00    130.0        3.6          5.0     183.0
2020-01-01 02:20:00    130.0        3.1          4.0     244.0
2020-01-01 02:50:00    140.0        3.6          4.0     366.0
2020-01-01 03:20:00    130.0        2.6          3.0   99999.0
2020-01-01 03:50:00    160.0        2.6          3.0      91.0
2020-01-01 04:20:00    170.0        2.6          3.0      61.0
2020-01-01 04:50:00    180.0        2.6          3.0      30.0
2020-01-01 05:20:00    150.0        1.5          3.0     183.0
2020-01-01 05:50:00    190.0        2.1          3.0      30.0
2020-01-01 06:20:00    190.0        2.1          3.0     122.0
2020-01-01 06:50:00    220.0        1.5          3.0     152.0
2020-01-01 07:20:00    230.0        2.1          3.0     213.0
2020-01-01 07:50:00    230.0        1.5          3.0     244.0
2020-01-01 08:20:00    999.0        1.0          3.0     335.0
2020-01-01 08:50:00    999.0        0.5          3.0     335.0
2020-01-01 09:20:00    120.0        2.1          3.0     335.0

我想重新采样获得:

WindDir  WindSpeed  Temperature  CloudHgt
Date                                                          
2020-01-01 00:00:00    150.0        3.6          5.0     213.0
2020-01-01 01:00:00    130.0        4.1          5.0     183.0
2020-01-01 02:00:00    130.0        3.6          5.0     183.0
2020-01-01 03:00:00    140.0        3.6          4.0     366.0
2020-01-01 04:00:00    160.0        2.6          3.0      91.0
2020-01-01 05:00:00    180.0        2.6          3.0      30.0
2020-01-01 06:00:00    190.0        2.1          3.0      30.0
2020-01-01 07:00:00    230.0        2.1          3.0     213.0
2020-01-01 08:00:00    230.0        1.5          3.0     244.0
2020-01-01 09:00:00    120.0        2.1          3.0     335.0

我读了一些关于SO的问题,比如这个,这个,这个和这个。然而,大多数都集中在没有DatetimeIndex的数据帧上,对于这些数据帧,样本的顺序无关紧要。此外,由于Groupby用该组的开始时间重新标记该组,因此查找具有相同索引的样本是不可行的。

我使用apply(lambda group: group.nlargest(1, columns=column))找到了一个有效的解决方案。然而,这在大型数据帧上非常缓慢。

目前我的代码看起来像:

# define grouper
grouper = pd.Grouper(freq='1H', offset='30min')
# aggregate data (except wind dir)
resampled = (data
.groupby(grouper)
.apply(lambda group: group.nlargest(1, columns=column))
.reset_index(level=-1, drop=True)
).shift(30,'min')

有没有更好的解决方案不使用apply函数,因为它非常慢

df.groupby(df.index.ceil(freq="H")).apply(lambda x: x.loc[x.WindDir.idxmax(), :])
#                      WindDir  WindSpeed  Temperature  CloudHgt
# Date                                                          
# 2020-01-01 01:00:00    150.0        3.6          5.0     213.0
# 2020-01-01 02:00:00    130.0        4.1          5.0     183.0
# 2020-01-01 03:00:00    140.0        3.6          4.0     366.0
# 2020-01-01 04:00:00    160.0        2.6          3.0      91.0
# 2020-01-01 05:00:00    180.0        2.6          3.0      30.0
# 2020-01-01 06:00:00    190.0        2.1          3.0      30.0
# 2020-01-01 07:00:00    220.0        1.5          3.0     152.0
# 2020-01-01 08:00:00    230.0        2.1          3.0     213.0
# 2020-01-01 09:00:00    999.0        1.0          3.0     335.0
# 2020-01-01 10:00:00    120.0        2.1          3.0     335.0

最新更新