每隔一段时间累计和

时间:2018-03-23 08:57:17

标签: python pandas cumsum

考虑这个数据框:

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年),依此类推。

1 个答案:

答案 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示例(因此width4而不是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

的新列