【问题标题】:Calculating the accumulated summation of clustered data in data frame in pandas计算pandas数据框中聚类数据的累积总和
【发布时间】:2015-06-29 11:53:06
【问题描述】:

给定以下数据框:

  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

感谢您的帮助!

【问题讨论】:

标签: python numpy pandas machine-learning dataframe


【解决方案1】:

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

【讨论】:

  • 当我做 to_zero = n & (df["value"].groupby(clusters).transform('size') == 1) 它给了我一个错误消息 TypeError: 'int' object is not callable 我的 python 是 2.7.3 BTW。谢谢!
  • 另外,如果我尝试计算每个集群的平均值或最大值,df["max"] = df["value"].groupby(clusters).max().fillna( 0) 不能正常工作。
  • 使用cummax解决。 mean 和 max 都无法正确排列索引。
  • @user6396:听起来你应该阅读文档的groupby 部分——然后你就会明白为什么你的maxmean 不起作用。特别是看transform
  • 感谢您的帮助。 pandas 新手,非常强大的工具!
猜你喜欢
  • 2016-05-23
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 2017-05-15
  • 1970-01-01
相关资源
最近更新 更多