从Python中数据帧的每一列的最后一个非零值计算累积总和

时间:2019-06-13 14:10:38

标签: python pandas

说我下面有一个数据框。对于每一列,我都有许多带有一些非零值的零。我想计算每一列的累积总和,但是我希望在出现零值时重置总和。

我的原始数据框:

pd.DataFrame({'a':[1,0,1,0,1,0,1,1],'b':[1,0,0,0,0,1,1,1]})

   a  b
0  1  1
1  0  0
2  1  0
3  0  0
4  1  0
5  0  1
6  1  1
7  1  1

我想要这样一个累加和:

   a  b
0  1  1
1  0  0
2  1  0
3  0  0
4  1  0
5  0  1
6  1  2
7  2  3

是否可以在python中不进行循环?谢谢!

2 个答案:

答案 0 :(得分:1)

一种方法是为每列创建自定义分组器,以0检查元素的相等性,并取所得到的一系列布尔值中的cumsum,并以cumsum进行转换:

g = df.eq(0).cumsum()
df.apply(lambda x: x.groupby(g[x.name]).transform('cumsum'))

   a  b
0  1  1
1  0  0
2  1  0
3  0  0
4  1  0
5  0  1
6  1  2
7  2  3

答案 1 :(得分:0)

您无法完全避免循环, 但是您可以避免使用正式的循环概念。

sum(x-1000 if x > 1000 else x for x in x_sph_rand)可以使用生成器来实现,效果更好一些,但是仍然使用循环...