#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()
?