首页 > 解决方案 > 熊猫:有两个条件的组内累计和

问题描述

我有一个如下表所示的 DataFrame:

指数 X 是的 值_1 cumsum_1 cumsum_2
0 0.1 1 12 12 0
1 1.2 1 10 12 10
2 0.25 1 7 19 10
3 1.0 2 3 0 3
4 0.72 2 5 5 10
5 1.5 2 10 5 13

所以我的目标是计算value_1. 但有两个条件必须考虑。

有人知道吗?

标签: pythonpandascumsum

解决方案


可以使用.where()on conditions x< 1 or x>= 1根据条件临时修改value_1为0,然后groupby cumsum,如下:

第二个条件由.groupby函数满足,而第一个条件由.where() 函数满足,详述如下:

.where()当条件为真时保留列值,当条件为假时更改值(在本例中为 0)。因此,对于列x< 1 的第一个条件,value_1将保留其值以馈送到后续cumsum步骤以累积 的过滤值value_1。对于条件x< 1 为 False 的行,value_1其值被屏蔽为 0。传递给cumsum累积的这些 0 实际上与将累积的原始值取出value_1到 column中的效果相同cumsum_1

第二行代码将value_1值累加到cumsum_2具有相反条件x>= 1 的列中。这 2 行代码实际上分别根据value_1< 1 和cumsum_1> = 1 分配。cumsum_2xx

(感谢@tdy 简化代码的建议)

df['cumsum_1'] = df['value_1'].where(df['x'] < 1, 0).groupby(df['y']).cumsum()
df['cumsum_2'] = df['value_1'].where(df['x'] >= 1, 0).groupby(df['y']).cumsum()

结果:

print(df)

      x  y  value_1  cumsum_1  cumsum_2
0  0.10  1       12        12         0
1  1.20  1       10        12        10
2  0.25  1        7        19        10
3  1.00  2        3         0         3
4  0.72  2        5         5         3
5  1.50  2       10         5        13

推荐阅读