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

如何用Pandas计算数据集最近12个月末值的乘积并存入val列?

解决Pandas计算最近12条记录乘积的问题

看起来你之前用循环和shift的思路走偏了——iterrows()里的row是单行数据,没法直接用shift(),而且手动写12个shift不仅繁琐还容易搞错方向(比如你写的shift(-6)是往后取数,不是往前的最近12个)。其实Pandas的rolling滑动窗口工具就能完美解决这个问题,效率还比循环高得多。

基础实现:计算全局最近12条记录的乘积

假设你的数据集已经按时间(月末)排序,且monthly列是需要计算乘积的数值列,步骤如下:

import pandas as pd

# 复制原数据并过滤空值
filtered_df = df.copy().dropna(subset=['monthly'])

# 确保数据按时间升序排列(关键!不然窗口会取错数据)
filtered_df = filtered_df.sort_values('your_date_column')  # 替换成你的日期列名,比如'month_end'

# 计算滑动窗口乘积,存入val列
# window=12:窗口大小为12(最近12条记录)
# min_periods=1:如果不足12条记录(比如前11行),也计算现有数据的乘积;如果要求必须满12条,就设为12
filtered_df['val'] = filtered_df['monthly'].rolling(window=12, min_periods=1).apply(lambda x: x.prod(), raw=True)

进阶:按分组计算最近12条记录的乘积

如果你的数据是分类别(比如不同产品、不同区域)的,需要每个组单独计算最近12个月的乘积,可以结合groupby和rolling:

# 假设存在分组列'category',按该列分组后计算滑动乘积
filtered_df['val'] = (
    filtered_df.groupby('category')['monthly']
    .rolling(window=12, min_periods=1)
    .apply(lambda x: x.prod(), raw=True)
    .reset_index(level=0, drop=True)  # 去掉分组索引,匹配原数据结构
)

为什么你的原方法行不通?

  • iterrows()循环里的row是单行的Series,shift()是针对整个列的操作,不能在单行上使用;
  • 你写的shift(-6)是向后取第6行的数据,而我们需要的是向前取最近11行+当前行的12条数据,应该用shift(1)到shift(11),但这种手动拼接的方式不仅代码冗余,还会因为索引问题出错;
  • 循环iterrows()在大数据集下效率极低,远不如Pandas内置的向量化操作(比如rolling)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:31:59