考虑这个数据框:
dfgg
Out[305]:
Parts_needed output
Year Month PartId
2018 1 L27849 72 72
2 L27849 75 147
3 L27849 101 248
4 L27849 103 351
5 L27849 77
6 L27849 120
7 L27849 59
8 L27849 79
9 L27849 28
10 L27849 64
11 L27849 511
12 L27849 34
2019 1 L27849 49
2 L27849 68
3 L27849 75
4 L27849 45
5 L27849 84
6 L27849 42
7 L27849 40
8 L27849 52
9 L27849 106
10 L27849 75
11 L27849 176
12 L27849 58 2193
2020 1 L27849 135 2328
2 L27849 45 2301
3 L27849 21 2247
4 L27849 35
5 L27849 17
6 L27849 39
...
2025 7 L27849 94
8 L27849 13
9 L27849 94
10 L27849 65
11 L27849 141
12 L27849 34
2026 1 L27849 22
2 L27849 132
3 L27849 49
4 L27849 33
5 L27849 48
6 L27849 53
7 L27849 103
8 L27849 122
9 L27849 171
10 L27849 182
11 L27849 68
12 L27849 23
2027 1 L27849 44
2 L27849 21
3 L27849 52
4 L27849 53
5 L27849 57
6 L27849 187
7 L27849 69
8 L27849 97
9 L27849 31
10 L27849 29
11 L27849 33
12 L27849 8
在这个数据框中,我需要以2年的间隔获得Parts_needed的累积总和。例如:
1-2018, 72
的{{1}}将继续添加到75,101,103..
以下的1-2020 135
行。同样,2-2018, 75
将继续添加到101,103..
以下2-2020 45
行。然而,在过去的两年中,累积金额将用于剩余的任何行。我无法使用np.cumsum设置范围()有人可以帮助我吗?
编辑:我已编辑,包含预期的输出。对于2-2020,输出为2328 + 45-72(因为72已添加2年)对于3-2020,输出为2301 + 21-75(因为75已添加2年),依此类推。
答案 0 :(得分:1)
如果开头是零填充,基本上你想要一个运行总计。你可以用卷积来做到这一点。这是一个简单的numpy示例,您应该能够适应您的pandas用例:
import numpy as np
a = np.array([10,20,3,4,5,6,7])
width = 4
kernel = np.ones(width)
np.convolve(a,kernel)
返回
array([10., 30., 33., 37., 32., 18., 22., 18., 13., 7.])
正如您所看到的,这是输出中37
之前的累计总和(或a[3]
),之后是滚动4元素窗口的总和。
假设每2年有24行,这对您有用。
以下是每年仅使用2个月的pandas示例(因此width
为4
而不是24
):
>>> import numpy as np
>>> import pandas as pd
>>> df = pd.DataFrame({'year':[18,18,19,19,20,20,21,21],'month':[1,2,1,2,1,2,1,2],'parts':[230,5,2,12,66,32,1,2]})
>>> df
month parts year
0 1 230 18
1 2 5 18
2 1 2 19
3 2 12 19
4 1 66 20
5 2 32 20
6 1 1 21
7 2 2 21
>>> width = 4
>>> kernel = np.ones(width)
>>> # Drop the last elements as you don't want the window to roll passed the end
>>> np.convolve(df['parts'],kernel)[:-width+1]
array([230., 235., 237., 249., 85., 112., 111., 101.])
现在,您只需将最后一个数组分配给DataFrame