Запуск сумм из одного столбца при условии значений в другом столбце - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть набор данных, содержащий значения данных, связанные со временем (среди других категорий), и я хотел бы добавить столбец накопленных значений, то есть сумму всех значений до и включая время.Итак, взяв что-то вроде этого:

   ID  YEAR  VALUE
0   A  2018    144
1   B  2018    147
2   C  2018    164
3   D  2018    167
4   A  2019    167
5   B  2019    109
6   C  2019    183
7   D  2019    121
8   A  2020    136
9   B  2020    187
10  C  2020    170
11  D  2020    188

и добавив столбец, подобный этому:

   ID  YEAR  VALUE  CUMULATIVE_VALUE
0   A  2018    144               144
1   B  2018    147               147
2   C  2018    164               164
3   D  2018    167               167
4   A  2019    167               311
5   B  2019    109               256
6   C  2019    183               347
7   D  2019    121               288
8   A  2020    136               447
9   B  2020    187               443
10  C  2020    170               517
11  D  2020    188               476

Где, например, в строке 7 CUMULATIVE_VALUE является суммой 2 VALUE для ID = "D "в 2018 и 2019 годах (и не 2020).

Я смотрел на cumsum(), но не вижу, как я мог бы использовать его в этом конкретном случае, поэтому лучшеЯ придумал вот что:

import numpy as np
import pandas as pd

np.random.seed(0)

ids=["A","B","C","D"]
years=[2018,2019,2020]

df = pd.DataFrame({"ID": np.tile(ids, 3), 
                   "YEAR": np.repeat(years, 4), 
                   "VALUE": np.random.randint(100,200,12)})
print(df)

df["CUMULATIVE_VALUE"] = None 
for id in ids:
  for year in years:
    df.loc[(df.ID==id) & (df.YEAR==year), "CUMULATIVE_VALUE"] = \
  df[(df.ID==id) & (df.YEAR <= year)].VALUE.sum()
print(df)

но я уверен, что должен быть лучший и более эффективный способ сделать это.Кто-нибудь?

1 Ответ

0 голосов
/ 10 декабря 2018

Вы можете использовать pd.Groupby для группировки по ID и агрегировать с cumsum:

df['CUMULATIVE_VALUE'] = df('ID').VALUE.cumsum()

 ID  YEAR  VALUE  CUMULATIVE_VALUE
0   A  2018    144               144
1   B  2018    147               147
2   C  2018    164               164
3   D  2018    167               167
4   A  2019    167               311
5   B  2019    109               256
6   C  2019    183               347
7   D  2019    121               288
8   A  2020    136               447
9   B  2020    187               443
10  C  2020    170               517
11  D  2020    188               476

В случае, если годы неотсортировано вместо:

df = df.sort_values(['ID','YEAR']).reset_index(drop=True)
df['cumsum'] = df.groupby('ID').agg({'VALUE':'cumsum'})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...