在某些情况下,我想要一个累加总和,常规累加总和由b列给出,但是我希望在d列中具有正常总和的累加总和结果不是:首先,累加的常规运算当求和结果在范围内(由0.2
和0.4
给定)时,求和。但是,当d列超出下边界(0.2
)或上边界(0.4
)时,我希望在a列为零(分别为0.1
和{ {1}})。所需的加减在c列中给出。第4行和第7行是修改后的行,其他行是常规的累加操作。
-0.1
答案 0 :(得分:0)
问题在于要添加的值实际上取决于当前总和。恕我直言,用真正的pandas表达式很难表达这一点,所以我只想迭代底层的numpy数组:
a = df['a'].values
d = np.zeros(len(a))
old = 0.
nv = 0.1
for i in range(len(a)):
if a[i] != 0. or (.2 < old < .4):
d[i] = old + a[i]
else:
d[i] = old + nv
nv = -nv
old = d[i]
df['d'] = d
它给出了预期的结果:
a d
0 0.10 0.10
1 0.20 0.30
2 -0.11 0.19
3 0.00 0.29
4 -0.07 0.22
5 0.20 0.42
6 0.00 0.32
效率不如真正的矢量化运算,但仍然比iterrows
答案 1 :(得分:0)
您可以分步解决此问题(不确定它的速度是否比Serge's approach快。
我们有您的列df['a']
,首先创建列df['b']
作为累积,并创建列df['c']
作为df['a']
的副本(如果您不要介意修改df['a']
上的值。
a b c
1 0.1 0.1 0.1
2 0.2 0.3 0.2
3 -0.11 0.19 -0.11
4 0.0 0.19 0.0
5 -0.07 0.12 -0.07
6 0.2 0.32 0.2
7 0.0 0.32 0.0
我们现在可以按照所需条件修改df['c']
中的值:
df.loc[(df['a']==0) & (df['b']<0.2),'c']=0.1
df.loc[(df['a']==0) & (df['b']>0.4),'c']=-0.1
最后取df['c']
df['c'].cumsum()
Out[]:
1 0.10
2 0.30
3 0.19
4 0.29
5 0.22
6 0.42
7 0.42