如何用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
相关产品推荐
相关产品推荐

