如何使用布尔变量根据if条件获得累计总和。

问题描述 投票:0回答:1

我有下面的数据框架,我想创建另一列,当match = False时,该列的行值为p_ln_p_by_q,当match为True时,逐行进行累加。

vote_prprtn uniform_votesh  p_by_q    ln_p_by_q   p_ln_p_by_q   match
0.0116     0.009367        1.238434   0.213848   0.002481       False
0.0100     0.009367        1.067616   0.065428   0.000654       True
0.0065     0.009367        0.693950  -0.365355   -0.002375      True
0.0072     0.006000        1.200000   0.182321   0.001313       False
0.0048     0.006000        0.800000  -0.223143   -0.001071      True

我想创建另一列 当匹配为False时,行值为p_ln_p_by_q 当匹配为True时,逐行进行累加。这样一直持续到下一个False值。我的最终数据框应该是这样的。

vote_prprtn uniform_votesh  p_by_q    ln_p_by_q   p_ln_p_by_q   match   final_val
0.0116     0.009367        1.238434   0.213848   0.002481       False    0.002481
0.0100     0.009367        1.067616   0.065428   0.000654       True     0.003135
0.0065     0.009367        0.693950  -0.365355   -0.002375      True     0.00076
0.0072     0.006000        1.200000   0.182321   0.001313       False    0.001313 
0.0048     0.006000        0.800000  -0.223143   -0.001071      True     0.000242

任何帮助都会让我真正理解excel和pandas之间的相似之处。

python pandas dataframe sumifs
1个回答
2
投票

groupby 使用一个组定义的每个时间 match==False 然后 cumsum 在每个组上。

df['final_val'] = df.groupby((~df.match).cumsum())['p_ln_p_by_q'].cumsum()

df['final_val']
# 0 0.002481
# 1 0.003135
# 2 0.000760
# 3 0.001313
# 4 0.000242

1
投票

我不知道你的数据框架是怎么做的,但你可以尝试一下这种风格的东西。

sum = 0
for row in frame.rows:
 if(row.match == False):
  sum = 0
 sum += row.p_ln_p_by_q
 row.final_val = sum

(注意调整你在行中的读写方式,这只是一个基于Python的伪代码)。

© www.soinside.com 2019 - 2024. All rights reserved.