在R中实现分组指标滚动求和:城市月度销售3个月滚动求和需求
嘿,这个滚动求和的需求特别常见,我给你准备了两个实用的解决方案——分别用Excel/Google Sheets和Python Pandas,你可以根据自己的工具偏好来选:
方案1:用Excel/Google Sheets实现
首先有个关键前提:必须先按「城市」分组,再按「月份从早到晚」排序,不然滚动求和的范围会错位。如果你的月份是文本格式(比如Jan/Feb),记得用自定义排序保证顺序正确,别让April跑到Feb前面哦。
假设你的数据在A:C列(A=Month, B=City, C=Sales),要在D列生成R3Month列:
- 选中所有数据,按「City」升序、「Month」升序排序;
- 在D2单元格输入公式:
=SUM(INDEX($C$2:$C$11,MAX(ROW()-2,MATCH($B2,$B$2:$B$11,0))):$C2) - 下拉填充整个D列即可。
这个公式的逻辑很灵活:自动找到当前城市的第一行数据,然后取「当前行往上2行(如果存在)到当前行」的销售额求和,完美处理不足3个月的情况(比如第一个月就只算当月,第二个月算前两个月的和)。
如果用的是Excel 365或Google Sheets,还可以用更简洁的动态数组公式,一次性生成所有结果:
=BYROW(B2:C11,LAMBDA(row,SUM(FILTER(C2:C11,(B2:B11=INDEX(row,1))*(ROW(C2:C11)>=ROW(INDEX(row,2))-2)*(ROW(C2:C11)<=ROW(INDEX(row,2)))))))
方案2:用Python Pandas实现
如果数据量比较大,用代码处理效率更高,步骤如下:
import pandas as pd # 构造你的原始数据(如果是CSV文件,用pd.read_csv()读取即可) data = pd.DataFrame({ 'Month': ['Jan', 'Jan', 'Feb', 'Feb', 'Mar', 'Mar', 'April', 'April', 'May', 'May'], 'City': ['Paris', 'NY', 'Paris', 'NY', 'Paris', 'NY', 'Paris', 'NY', 'Paris', 'NY'], 'Sales': [1000, 2000, 1200, 3000, 1000, 2000, 1400, 1000, 2000, 1000] }) # 定义月份的正确顺序,避免按字母排序出错 month_order = ['Jan', 'Feb', 'Mar', 'April', 'May'] data['Month'] = pd.Categorical(data['Month'], categories=month_order, ordered=True) # 按城市和月份排序 data_sorted = data.sort_values(['City', 'Month']) # 按城市分组,计算3个月滚动求和(min_periods=1表示不足3个月时取现有数据求和) data_sorted['R3Month'] = data_sorted.groupby('City')['Sales'].rolling(window=3, min_periods=1).sum().reset_index(drop=True) # 打印结果 print(data_sorted)
运行后会得到你想要的结果:
Month City Sales R3Month 0 Jan Paris 1000 1000.0 2 Feb Paris 1200 2200.0 4 Mar Paris 1000 3200.0 6 April Paris 1400 3600.0 8 May Paris 2000 4400.0 1 Jan NY 2000 2000.0 3 Feb NY 3000 5000.0 5 Mar NY 2000 7000.0 7 April NY 1000 6000.0 9 May NY 1000 4000.0
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

