python - 根据 Python DF 中的其他 2 列计算滚动总和
问题描述
我希望创建一个滚动 3 个月限制,如下表所示。该限制基于前缀和 sic 组合。所以当 AB 1 到 12 月时,我想要 AB 1 Months 12 + 1 + 2 的总和
解决这个问题的最佳方法是什么?我使用过 .rolling 但不确定如何处理前缀 /sic 更改的位置。
作为参考,我已经在“滚动 3 个月限制”列中手动输入了我正在寻找的答案。
+-------+--------+-----+--------+------ ------+ | 月 | 前缀 | 原文如此 | 限制 | 滚动 3 个月限制 | +-------+--------+-----+--------+------ ------+ | 1 | AB | 1 | 16.5 | 54.3 | | 2 | AB | 1 | 22.6 | 68.2 | | 3 | AB | 1 | 15.2 | 175.8 | | 4 | AB | 1 | 30.4 | 360.2 | | 5 | AB | 1 | 130.2 | 371 | | 6 | AB | 1 | 199.6 | 262.5 | | 7 | AB | 1 | 41.2 | 80.7 | | 8 | AB | 1 | 21.7 | 61.2 | | 9 | AB | 1 | 17.8 | 53.4 | | 10 | AB | 1 | 21.7 | 53.4 | | 11 | AB | 1 | 13.9 | 48.2 | | 12 | AB | 1 | 17.8 | 56.9 | | 1 | AB | 10 | 9.8 | 32.4 | | 2 | AB | 10 | 9.8 | 134.2 | | 3 | AB | 10 | 12.8 | 132.7 | | 4 | AB | 10 | 111.6 | 276.9 | | 5 | AB | 10 | 8.3 | 252.9 | | 6 | AB | 10 | 157 | 244.6 | | 7 | AB | 10 | 87.6 | | +-------+--------+-----+--------+------ ------+
解决方案
import pandas as pd
d = {'Month':[1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7],
'prefix':['AB','AB','AB','AB','AB','AB','AB','AB','AB','AB','AB','AB','AB','AB','AB','AB','AB','AB','AB'],
'sic':[1,1,1,1,1,1,1,1,1,1,1,1,10,10,10,10,10,10,10],
'limits':[16.5,22.6,15.2,30.4,130.2,199.6,41.2,21.7,17.8,21.7,13.9,17.8,9.8,9.8,12.8,111.6,8.3,157,97.6],}
df = pd.DataFrame(d)
df['Rolling 3 month Limit'] = ''
def calc_roll(m,p,s):
if m < 10: months = [m,m+1,m+2]
if m == 10: months = [12,1,2]
if m == 12: months = [12,1,2]
if m == 11: months = [11,12,1]
f = df.loc[(df['Month'].isin(months)) & (df['prefix'] == p) & (df['sic'] == s)]
if len(f) < 3: return ''
else: return sum(f['limits'])
df['Rolling 3 month Limit'] = df.apply(lambda x: calc_roll(x['Month'], x['prefix'], x['sic']),axis=1)
#Output
Month prefix sic limits Rolling 3 month Limit
0 1 AB 1 16.5 54.3
1 2 AB 1 22.6 68.2
2 3 AB 1 15.2 175.8
3 4 AB 1 30.4 360.2
4 5 AB 1 130.2 371
5 6 AB 1 199.6 262.5
6 7 AB 1 41.2 80.7
7 8 AB 1 21.7 61.2
8 9 AB 1 17.8 53.4
9 10 AB 1 21.7 56.9
10 11 AB 1 13.9 48.2
11 12 AB 1 17.8 56.9
12 1 AB 10 9.8 32.4
13 2 AB 10 9.8 134.2
14 3 AB 10 12.8 132.7
15 4 AB 10 111.6 276.9
16 5 AB 10 8.3 262.9
17 6 AB 10 157.0
18 7 AB 10 97.6
我已经编写了这段代码来获得你想要的输出。让我知道是否有任何疑问!
编辑:
您可以调整if len(f) < 2:
以获得准确的结果。
推荐阅读
- python - 迭代循环以获取每个不同日期变量的数据帧变量的 cumsum(非聚合)
- bash - bash 命令可以多长时间?
- c# - 如何在 C# 中以编程方式确定 Windows 7 的子版本?
- python - manage.py runserver后如何自动执行代码
- android - 尝试将 Content Uri 从活动传递到服务时出现权限错误
- macos - 子目录项目的 Composer 卸载 (Mac)
- excel - Excel VBA 中有没有办法检查一个工作簿中的数字序列,找到最后一个,然后在另一个工作簿中继续?
- node.js - 一段时间后,Socket io 连接断开
- c# - 如何访问从asp.net核心中的jquery文件上传发送的附加表单数据?
- r - 如何在 R 中重现以下涉及 for 循环的 matlab 代码?