说我下面有一个数据框。对于每一列,我都有许多带有一些非零值的零。我想计算每一列的累积总和,但是我希望在出现零值时重置总和。
我的原始数据框:
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中不进行循环?谢谢!
答案 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)
可以使用生成器来实现,效果更好一些,但是仍然使用循环...