计算pandas中数据帧中聚类数据的累计总和

时间:2015-04-22 03:23:32

标签: python numpy pandas machine-learning dataframe

给出以下数据框:

  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将它们分开,我们将其视为一个数据集群,这样我们就可以拥有以下数据帧: / p>

  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

感谢您的帮助!

1 个答案:

答案 0 :(得分:5)

您可以使用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