如何对小时级时序数据按4行分组累加并保留每组末行?
问题描述
我有如下时序数据(每行代表1小时):
0 1.514333e+12 1 1.514419e+12 2 1.514506e+12 3 1.514592e+12 4 1.514678e+12 ... 1881 1.676851e+12 1882 1.676938e+12 1883 1.677024e+12 1884 1.677110e+12 1885 1.677146e+12 Name: volume1d, Length: 1886, dtype: float64
需要实现以下操作:
- 按每4行(4小时)分组,最后一组不足4行也单独分组
- 对每组内的数据进行累加计算
- 仅保留每组的最后一行(即每组累加后的最终结果)
举个示例:
原始分组数据:
a b 1 2 1 3 1 4 1 4 2 3 2 4 2 5 2 4 3 4
分组累加后:
a b c 1 2 2 1 3 5 1 4 9 1 4 13 2 3 3 2 4 7 2 5 12 2 4 16 3 4 4
最终保留每组最后一行:
a b c 1 4 13 2 4 16 3 4 4
解决方案
使用Pandas可以快速实现需求,以下是具体代码:
假设你的数据是名为volume1d的Pandas Series:
import pandas as pd # 1. 创建分组键:每4行一组,索引整除4生成分组标签 groups = volume1d.index // 4 # 2. 计算每组内的累加值 volume1d_cum = volume1d.groupby(groups).cumsum() # 3. 合并原始数据与累加值,保留每组最后一行 result_df = pd.DataFrame({ 'volume1d': volume1d, 'cumulative_volume': volume1d_cum }).groupby(groups).tail(1)
如果你只需要最终的累加结果,也可以用更简洁的写法:
result_series = volume1d.groupby(volume1d.index // 4).apply(lambda x: x.cumsum().iloc[-1]) # 转成DataFrame并重置索引 result_df = result_series.reset_index(name='cumulative_volume')
代码说明
volume1d.index // 4:通过索引整除4生成连续的分组标签,自动处理最后一组不足4行的情况groupby(groups).cumsum():对每个分组内的数据逐行累加,得到每行的累计值groupby(groups).tail(1):提取每个分组的最后一行,即该组累加后的最终结果
示例验证
用你提供的示例数据测试:
df = pd.DataFrame({'a': [1,1,1,1,2,2,2,2,3], 'b': [2,3,4,4,3,4,5,4,4]}) groups = df.index // 4 df['c'] = df['b'].groupby(groups).cumsum() result = df.groupby(groups).tail(1)
输出结果:
a b c 3 1 4 13 7 2 4 16 8 3 4 4
完全符合需求。
内容的提问来源于stack exchange,提问作者Habi
相关产品推荐
相关产品推荐

