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

如何在Pandas中创建带重叠的自定义GroupBy对象?

实现重叠窗口分组并生成SeriesGroupBy对象

要实现你需要的重叠窗口分组(每组10行、步长5行)并得到标准的SeriesGroupBy对象,核心是为每个窗口的行分配对应的组标签,通过这个标签列进行分组,就能直接使用pandas GroupBy的所有内置方法。

高效实现方案(基于Numpy)

利用Numpy的广播特性快速生成所有窗口的行索引和对应组ID,避免循环提升效率:

import pandas as pd
import numpy as np

def get_overlapping_group_labels(df, bucket_size, overlap):
    step = bucket_size - overlap
    n_rows = df.shape[0]
    # 生成所有窗口的起始索引
    starts = np.arange(0, n_rows - bucket_size + 1, step)
    # 生成每个窗口包含的所有行索引(广播实现)
    window_indices = starts[:, None] + np.arange(bucket_size)
    # 生成每个窗口对应的组ID(重复bucket_size次)
    group_ids = np.repeat(np.arange(len(starts)), bucket_size)
    # 构建组标签Series:索引为行索引,值为组ID
    return pd.Series(group_ids, index=window_indices.ravel())

# 示例用法
# 构造测试数据
df = pd.DataFrame({'value': range(20)}, index=pd.RangeIndex(20))
# 设置参数:每组10行,重叠5行
bucket = 10
overlap = 5

# 获取组标签
group_labels = get_overlapping_group_labels(df, bucket, overlap)
# 生成SeriesGroupBy对象(以'value'列为例)
s_grouped = df['value'].groupby(group_labels)

验证分组结果

你可以通过遍历分组查看每个窗口的内容:

for group_id, group_data in s_grouped:
    print(f"组{group_id}: {group_data.tolist()}")

输出结果:

组0: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
组1: [5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
组2: [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

为什么你的生成器无法使用GroupBy方法

你编写的生成器只是逐个返回独立的DataFrame切片,这些切片不属于pandas的GroupBy体系——GroupBy对象依赖于每行与组标签的映射关系来统一管理所有组的聚合逻辑,而生成器无法提供这种映射,因此无法直接调用mean()、sum()等GroupBy内置方法。

内容的提问来源于stack exchange,提问作者Jose M Gonzalez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:20:58