一列中的运行总和以另一列中的值为条件

时间:2018-12-10 14:08:44

标签: python-3.x pandas

我有一个数据集,其中包含与时间相关联的数据值(以及其他类别),我想添加一个累加值列-即,直到并包括时间的所有值的总和。因此,采取这样的做法:

   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是2018年和2019年(以及 2020年)中ID =“ D”的2个值的总和。

我看过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 :(得分:1)

您可以使用pd.GroupbyID分组并与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'})