您的位置:首页 >高效计算按类别与滑动日期窗口分组的条件均值(或和)
发布于2026-04-01 阅读(0)
扫一扫,手机访问

本文介绍如何在大型Pandas数据集中(如50万行)高效计算每个样本在其所属类别内、且日期落在±14天滑动窗口内的X-Value之和,避免低效的逐行遍历,推荐使用基于时间索引的groupby().rolling()方案。
本文介绍如何在大型Pandas数据集中(如50万行)高效计算每个样本在其所属类别内、且日期落在±14天滑动窗口内的X-Value之和,避免低效的逐行遍历,推荐使用基于时间索引的`groupby().rolling()`方案。
在处理带时间维度的分组聚合任务时,尤其是需对每个样本动态定义“邻近时间窗口”(如±14天),传统df.apply()配合布尔索引的方式虽逻辑清晰,但时间复杂度为O(n²),面对50万行数据极易成为性能瓶颈。更优解是利用Pandas原生支持的时间感知滚动窗口(time-based rolling window),结合分组操作,实现向量化、近线性时间复杂度的高效计算。
核心思路是:
✅ 将日期列设为索引(确保DatetimeIndex类型);
✅ 按Category分组,对每组独立应用时间窗口滚动聚合;
✅ 使用rolling(window="29D", center=True)——"29D"表示总跨度29天(含当日),center=True确保窗口以当前行为中心,等价于[date−14D, date+14D]闭区间(Pandas默认包含端点);
✅ 聚合函数选用.sum()(题干需求为“sum”,若需均值可改用.mean());
✅ 最后通过merge或map将结果回填至原始DataFrame。
以下为完整可运行示例:
import pandas as pd
from datetime import timedelta
# 构造示例数据(注意:Date需为datetime类型)
data = {
"Date": pd.date_range(start="2024-03-01", periods=5, freq="D"),
"Category": ["Red", "Red", "Red", "Blue", "Red"],
"X-Value": [12, 19, 15, 22, 18],
}
df = pd.DataFrame(data)
# ✅ 关键步骤:设置日期索引 + 分组滚动求和(±14天 → window="29D")
df_rolling_sum = (
df.set_index("Date") # 设Date为索引
.groupby("Category")["X-Value"] # 按Category分组,选取X-Value列
.rolling(window="29D", center=True) # 时间窗口:29天,居中对齐
.sum() # 计算窗口内X-Value之和
.reset_index(name="cohort_sum") # 恢复索引并重命名
)
# ✅ 合并回原始DataFrame(保持行序一致)
df_result = df.merge(df_rolling_sum, on=["Date", "Category"], how="left")
print(df_result)输出:
Date Category X-Value cohort_sum 0 2024-03-01 Red 12 46.0 1 2024-03-02 Red 19 46.0 2 2024-03-03 Red 15 46.0 3 2024-03-04 Blue 22 22.0 4 2024-03-05 Red 18 33.0
? 验证说明:第0行(2024-03-01)的窗口为[2024-02-16, 2024-03-16],覆盖第0–2行(同属Red),故12+19+15=46;第4行(2024-03-05)窗口覆盖第2–4行(2024-03-03至2024-03-05),即15+18=33(第3行Category不同,自动排除)。
关键注意事项:
进阶提示:
此方案兼顾简洁性、可读性与工业级性能,是处理“类别+动态时间窗口”聚合任务的标准实践。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9