累积总和但有条件地排除较早的行

我有一个像这样的数据帧:

df = pd.DataFrame({
  'val_a': [3, 3, 3, 2, 2, 2, 1, 1, 1],
  'val_b': [3, np.nan, 2, 2, 2, 0, 1, np.nan, 0],
  'quantity': [1, 4, 2, 8, 5, 7, 1, 4, 2]
})

它看起来像这样:

|    |   val_a |   val_b |   quantity |
|---:|--------:|--------:|-----------:|
|  0 |       3 |       3 |          1 |
|  1 |       3 |     nan |          4 |
|  2 |       3 |       2 |          2 |
|  3 |       2 |       2 |          8 |
|  4 |       2 |       2 |          5 |
|  5 |       2 |       0 |          7 |
|  6 |       1 |       1 |          1 |
|  7 |       1 |     nan |          4 |
|  8 |       1 |       0 |          2 |
|    |   val_a |   val_b |   quantity |
|---:|--------:|--------:|-----------:|
|  0 |       3 |       3 |          1 |
|  1 |       3 |     nan |          4 |
|  2 |       3 |       2 |          2 |
|  3 |       2 |       2 |          8 |
|  4 |       2 |       2 |          5 |
|  5 |       2 |       0 |          7 |
|  6 |       1 |       1 |          1 |
|  7 |       1 |     nan |          4 |
|  8 |       1 |       0 |          2 |

它是由 订购的val_a。我想quantity对每个val_a. 所以:

这使

|   val_a |   quantity |
|--------:|-----------:|
|       3 |          7 |
|       2 |         27 |
|       1 |         34 |

然而,这是棘手的部分。

我想排除值val_b大于 key 的行val_a。我会用一个例子来澄清:

  • 计算总用于当当val_a3,没有行的具有val_b大于val_a。所以当val_a是的累计总数37;
  • 计算总用于当时val_a2,则行0具有val_b大于2。该行有quantity1。所以,不包括该行,当val_a是的累计总数227 - 1,即26
  • 计算总用于当时val_a1,则行0,2,3,4具有val_b大于1,。该行有quantity1。所以,不包括该行,当val_a是的累计总数134 - 1 - 2 - 8 - 5,即18

这是所需的输出:

|   val_a |   quantity |
|--------:|-----------:|
|       3 |          7 |
|       2 |         26 |
|       1 |         18 |

以上是累积总和但有条件地排除较早的行的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>