Накопительная сумма Pandas без изменения номера заказа за неделю

#python #python-3.x #pandas #group-by #cumulative-sum

#python #python-3.x #pandas #группировка по #накопительная сумма

Вопрос:

У меня есть фрейм данных, который выглядит следующим образом:

df:

 RY  Week no Value
2020    14  3.95321
2020    15  3.56425
2020    16  0.07042
2020    17  6.45417
2020    18  0.00029
2020    19  0.27737
2020    20  4.12644
2020    21  0.32753
2020    22  0.47239
2020    23  0.28756
2020    24  1.83029
2020    25  0.75385
2020    26  2.08981
2020    27  2.05611
2020    28  1.00614
2020    29  0.02105
2020    30  0.58101
2020    31  3.49083
2020    32  8.29013
2020    33  8.99825
2020    34  2.66293
2020    35  0.16448
2020    36  2.26301
2020    37  1.09302
2020    38  1.66566
2020    39  1.47233
2020    40  6.42708
2020    41  2.67947
2020    42  6.79551
2020    43  4.45881
2020    44  1.87972
2020    45  0.76284
2020    46  1.8671
2020    47  2.07159
2020    48  2.87303
2020    49  7.66944
2020    50  1.20421
2020    51  9.04416
2020    52  2.2625
2020    1   1.17026
2020    2   14.22263
2020    3   1.36464
2020    4   2.64862
2020    5   8.69916
2020    6   4.51259
2020    7   2.83411
2020    8   3.64183
2020    9   4.77292
2020    10  1.64729
2020    11  1.6878
2020    12  2.24874
2020    13  0.32712
  

Я создал столбец без недели, используя дату. В моем сценарии нормативный год начинается с 1 апреля и заканчивается 31 марта следующего года, поэтому неделя no начинается с 14 и заканчивается в 13. Теперь я хочу создать еще один столбец, содержащий совокупную сумму столбца значений. Я попытался использовать cumsum(), используя следующий код:

 df['Cummulative Value'] = df.groupby('RY')['Value'].apply(lambda x:x.cumsum())
  

Проблема с приведенным выше кодом заключается в том, что он начинает вычислять накопительную сумму с недели № 1, а не с недели № 14 и далее. Есть ли какой-либо способ рассчитать накопительную сумму, не нарушая номер заказа за неделю?

Ответ №1:

РЕДАКТИРОВАТЬ: вы можете сортировать значения по RY и Week no до GroupBy.cumsum и по последнему индексу сортировки для исходного заказа:

 #create default index for correct working
df = df.reset_index(drop=True)
df['Cummulative Value'] = df.sort_values(['RY','Week no']).groupby('RY')['Value'].cumsum().sort_index()
print (df)
      RY  Week no     Value  Cummulative Value
0   2020       14   3.95321           53.73092
1   2020       15   3.56425           57.29517
2   2020       16   0.07042           57.36559
3   2020       17   6.45417           63.81976
4   2020       18   0.00029           63.82005
5   2020       19   0.27737           64.09742
6   2020       20   4.12644           68.22386
7   2020       21   0.32753           68.55139
8   2020       22   0.47239           69.02378
9   2020       23   0.28756           69.31134
10  2020       24   1.83029           71.14163
11  2020       25   0.75385           71.89548
12  2020       26   2.08981           73.98529
13  2020       27   2.05611           76.04140
14  2020       28   1.00614           77.04754
15  2020       29   0.02105           77.06859
16  2020       30   0.58101           77.64960
17  2020       31   3.49083           81.14043
18  2020       32   8.29013           89.43056
19  2020       33   8.99825           98.42881
20  2020       34   2.66293          101.09174
21  2020       35   0.16448          101.25622
22  2020       36   2.26301          103.51923
23  2020       37   1.09302          104.61225
24  2020       38   1.66566          106.27791
25  2020       39   1.47233          107.75024
26  2020       40   6.42708          114.17732
27  2020       41   2.67947          116.85679
28  2020       42   6.79551          123.65230
29  2020       43   4.45881          128.11111
30  2020       44   1.87972          129.99083
31  2020       45   0.76284          130.75367
32  2020       46   1.86710          132.62077
33  2020       47   2.07159          134.69236
34  2020       48   2.87303          137.56539
35  2020       49   7.66944          145.23483
36  2020       50   1.20421          146.43904
37  2020       51   9.04416          155.48320
38  2020       52   2.26250          157.74570
39  2020        1   1.17026            1.17026
40  2020        2  14.22263           15.39289
41  2020        3   1.36464           16.75753
42  2020        4   2.64862           19.40615
43  2020        5   8.69916           28.10531
44  2020        6   4.51259           32.61790
45  2020        7   2.83411           35.45201
46  2020        8   3.64183           39.09384
47  2020        9   4.77292           43.86676
48  2020       10   1.64729           45.51405
49  2020       11   1.68780           47.20185
50  2020       12   2.24874           49.45059
51  2020       13   0.32712           49.77771
  

Редактировать:

После некоторого обсуждения решение должно быть упрощено GroupBy.cumsum :

 df['Cummulative Value'] = df.groupby('RY')['Value'].cumsum()
  

Комментарии:

1. @jezreal Но я не хочу перезапускать накопительную сумму через 52 недели. Я хочу продолжить добавлять накопительную сумму. Есть ли какой-нибудь способ?

2. Но все же накопительная сумма начинается снова с недели 1. она не суммирует предыдущие значения накопительной суммы

3. @user2293224 — Я думаю, что я не понимаю ожидаемый результат: (

4. ожидаемый результат аналогичен тому, что вы создали. Единственное отличие заключается в том, что значение кумулятивной суммы должно продолжать добавлять значение при запуске недели 1. Например, в строке 39 значение совокупной суммы равно 1.17026, оно должно быть 158.91596. Он должен продолжать добавлять число до конца

5. @user2293224 — Хорошо, но почему ваше решение не работает? df['Cummulative Value'] = df.groupby('RY')['Value'].cumsum() ?