【问题标题】:Sum within column based on values from another column根据另一列的值在列内求和
【发布时间】:2021-05-05 16:53:28
【问题描述】:

对于value_to_sumindicator 列,我有一个如下所示的熊猫数据框。我想将value_to_sum 中的所有值相加,直到并包括indicator == True 所在列中的最新值。如果indicator == False,我不想和。

row value_to_sum indicator desired_outcome
1 1 True NaN
2 3 True 1
3 1 False NaN
4 2 False NaN
5 4 False NaN
6 6 True 10
7 2 True 6
8 3 False NaN

如何实现desired_outcome下的值?

【问题讨论】:

  • 您写道:“直到并包括最近的值”,但您在第 2 行中的示例显示其他内容。还是我在这里误解了什么?否则为什么第 6 行是第 9 行?
  • 我不想在 desired_outcome 下的总和中的同一行中包含 value_to_sum 中的值。但是总和应该包括indicator == True 的最后一行。所以“最近”是指我们所在行上一个的最近行。
  • 好的,但是为什么第 6 行等于 9?
  • 好收获!我总结错了!第 6 行的总和应该是第 2-5 行的总和 (3+1+2+4 = 10)。

标签: python pandas


【解决方案1】:

您可以根据indicator 列的True.cumsum() 值设置一个组,然后将.groupby().transform() 一起使用以获得每个组的value_to_sum 的总和。

然后,对于indicator == True,由于期望的结果取决于上一行,我们使用.shift() 从最后一行获取desired_outcome 的值。同时,对于indicator == False,我们将desired_outcome的值设置为NaN。最后两个步骤是通过调用 np.where() 来完成的。

df['desired_outcome'] = df.assign(group=df['indicator'].cumsum()).groupby('group')['value_to_sum'].transform('sum')
df['desired_outcome'] = np.where(df['indicator'], df['desired_outcome'].shift(), np.nan)

结果:

print(df)



   row  value_to_sum  indicator  desired_outcome
0    1             1       True              NaN
1    2             3       True              1.0
2    3             1      False              NaN
3    4             2      False              NaN
4    5             4      False              NaN
5    6             6       True             10.0
6    7             2       True              6.0
7    8             3      False              NaN

【讨论】:

    猜你喜欢
    • 2016-01-16
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2021-08-07
    • 2017-04-20
    • 1970-01-01
    相关资源
    最近更新 更多