【问题标题】:How do I get cumulative sum based on 'if' condition using a Boolean variable如何使用布尔变量根据“if”条件获得累积总和
【发布时间】:2020-08-17 12:01:31
【问题描述】:

我有以下数据框:

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

我想创建另一列,当 match = False 时行值为 p_ln_p_by_q 并在 match 为 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】:

    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
    

    【讨论】:

    • 您的代码运行良好。我用谷歌搜索了cumsum() 并了解到这是一个获取累积和的函数。我了解您正在尝试按匹配列中的 False 值进行分组,并希望对这些分组值进行累积求和。但我想知道你为什么在((~df.match).cumsum()) 中使用cumsum()。你能解释一下吗?
    • 当然,match的前5条记录是[False, True, True, False, True],其中前3条记录属于1组,后2条属于2组,否定match的结果是[True, False, False, True, False],如果你执行cumsum(),那么:[1,1,1, 2,2] 因为整数True == 1False ==0 所以基本上你已经创建了一个列来告诉groupby 哪些是组。
    【解决方案2】:

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

    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 的伪代码)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-16
      • 2021-12-07
      • 2019-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多