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

如何在Pandas中结合GroupBy实现各ID独立的Rolling计算?

解决分ID独立Rolling计算的问题

这问题我平时处理时序数据时经常碰到!核心症结就是没给Rolling计算加上分组边界限制,导致不同ID的数据串到一起了。要实现每个ID独立重启Rolling逻辑,关键是先按ID分组,再在组内执行滚动计算,具体分两种常用场景给你讲:

场景1:Pandas 环境下的实现

假设你的数据是带ID和数值列的DataFrame,先看错误的做法(就是你现在遇到的情况):

import pandas as pd

# 示例数据
df = pd.DataFrame({
    'ID': ['01', '01', '01', '02', '02', '02'],
    'value': [10, 20, 30, 40, 50, 60]
})

# 错误:直接全局Rolling,会跨ID取数
df['wrong_mean'] = df['value'].rolling(window=2).mean()

运行后你会看到ID02的第一个均值是(30+40)/2=35,用了ID01的最后一个值,这明显不符合需求。

正确实现方式

用groupby按ID分组,再对每个组单独执行Rolling计算,最后把结果合并回原表:

# 按ID分组,组内计算滚动均值,重置索引对齐原表
df['rolling_mean'] = df.groupby('ID')['value'].rolling(window=2).mean().reset_index(level=0, drop=True)

这样每个ID的Rolling窗口都会从组内第一条数据开始重新计算,ID02的第一个均值会因为窗口不够显示为NaN,完全符合预期。

如果需要其他滚动统计(比如求和、最大值),只需要把mean()换成sum()/max()等函数就行,逻辑完全一致。

场景2:PySpark 环境下的实现

如果是大数据场景用PySpark,思路是用窗口函数的partitionBy指定分组列,确保窗口计算只在ID组内进行:

from pyspark.sql import Window
import pyspark.sql.functions as F

# 假设数据带时间戳(时序数据通常需要排序)
df = spark.createDataFrame([
    ('01', '2024-01-01', 10),
    ('01', '2024-01-02', 20),
    ('01', '2024-01-03', 30),
    ('02', '2024-01-01', 40),
    ('02', '2024-01-02', 50),
    ('02', '2024-01-03', 60)
], schema=['ID', 'timestamp', 'value'])

# 定义窗口:按ID分区,按时间排序,窗口包含当前行和前1行(窗口大小2)
window_spec = Window.partitionBy('ID').orderBy('timestamp').rowsBetween(-1, 0)

# 计算组内滚动均值
df = df.withColumn('rolling_mean', F.avg('value').over(window_spec))

这里的partitionBy('ID')就是核心,它让窗口计算被限制在每个ID内部,不会跨组取数。

核心总结

不管用什么工具,实现分ID独立Rolling的关键都是:先按ID划分独立计算单元,再在单元内执行滚动窗口逻辑,从根源上避免跨ID的数据干扰。

内容的提问来源于stack exchange,提问作者Nilzone-

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:49:47