You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对小时级时序数据按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

需要实现以下操作:

  1. 按每4行(4小时)分组,最后一组不足4行也单独分组
  2. 对每组内的数据进行累加计算
  3. 仅保留每组的最后一行(即每组累加后的最终结果)

举个示例:
原始分组数据:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 21:21:47