带条件的累计和熊猫数据框

时间:2019-05-24 11:57:14

标签: python dataframe sum

在某些情况下,我想要一个累加总和,常规累加总和由b列给出,但是我希望在d列中具有正常总和的累加总和结果不是:首先,累加的常规运算当求和结果在范围内(由0.20.4给定)时,求和。但是,当d列超出下边界(0.2)或上边界(0.4)时,我希望在a列为零(分别为0.1和{ {1}})。所需的加减在c列中给出。第4行和第7行是修改后的行,其他行是常规的累加操作。

-0.1

2 个答案:

答案 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