给定以下数据框:

  index       value
    1          0.8
    2          0.9
    3          1.0
    4          0.9
    5          nan
    6          nan
    7          nan
    8          0.4
    9          0.9
   10          nan
   11          0.8
   12          2.0
   13          1.4
   14          1.9
   15          nan
   16          nan
   17          nan
   18          8.4
   19          9.9
   20          10.0
   …


其中数据“值”由值NAN分为多个簇。有什么方法可以计算一些值,例如累加总和或集群数据的均值,例如,我要计算累加和并生成以下数据帧:

  index       value        cumsum
    1          0.8          0.8
    2          0.9          1.7
    3          1.0          2.7
    4          0.9          3.6
    5          nan          0
    6          nan          0
    7          nan          0
    8          0.4          0.4
    9          0.9          1.3
   10          nan          0
   11          0.8          0.8
   12          2.0          2.8
   13          1.4          4.2
   14          1.9          6.1
   15          nan          0
   16          nan          0
   17          nan          0
   18          8.4          8.4
   19          9.9          18.3
   20          10.0         28.3
   …


有什么建议么?

同样作为问题的简单扩展,如果两个数据簇足够接近,例如只有1个NAN分开,则我们将其视为一个数据簇,这样我们就可以具有以下数据帧:

  index       value        cumsum
    1          0.8          0.8
    2          0.9          1.7
    3          1.0          2.7
    4          0.9          3.6
    5          nan          0
    6          nan          0
    7          nan          0
    8          0.4          0.4
    9          0.9          1.3
   10          nan          1.3
   11          0.8          2.1
   12          2.0          4.1
   13          1.4          5.5
   14          1.9          7.4
   15          nan          0
   16          nan          0
   17          nan          0
   18          8.4          8.4
   19          9.9          18.3
   20          10.0         28.3


感谢您的帮助!

最佳答案

您可以使用compare-cumsum-groupby模式进行第一部分。您的“简单扩展名”并不是那么简单,但是我们仍然可以通过找出要视为零的value部分来实现它:

n = df["value"].isnull()
clusters = (n != n.shift()).cumsum()
df["cumsum"] = df["value"].groupby(clusters).cumsum().fillna(0)

to_zero = n & (df["value"].groupby(clusters).transform('size') == 1)
tmp_value = df["value"].where(~to_zero, 0)
n2 = tmp_value.isnull()
new_clusters = (n2 != n2.shift()).cumsum()
df["cumsum_skip1"] = tmp_value.groupby(new_clusters).cumsum().fillna(0)


产生

>>> df
    index  value  cumsum  cumsum_skip1
0       1    0.8     0.8           0.8
1       2    0.9     1.7           1.7
2       3    1.0     2.7           2.7
3       4    0.9     3.6           3.6
4       5    NaN     0.0           0.0
5       6    NaN     0.0           0.0
6       7    NaN     0.0           0.0
7       8    0.4     0.4           0.4
8       9    0.9     1.3           1.3
9      10    NaN     0.0           1.3
10     11    0.8     0.8           2.1
11     12    2.0     2.8           4.1
12     13    1.4     4.2           5.5
13     14    1.9     6.1           7.4
14     15    NaN     0.0           0.0
15     16    NaN     0.0           0.0
16     17    NaN     0.0           0.0
17     18    8.4     8.4           8.4
18     19    9.9    18.3          18.3
19     20   10.0    28.3          28.3

10-02 07:34
查看更多