给定以下数据框:
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 …
其中,’value’数据通过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 …
有什么建议吗?
作为问题的简单扩展,如果两个数据聚类足够接近,例如只由一个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
感谢您的帮助!
回答:
您可以使用比较-累积和-分组模式来完成第一部分。您的“简单扩展”并不那么简单,但我们仍然可以通过找出我们希望视为零的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_skip10 1 0.8 0.8 0.81 2 0.9 1.7 1.72 3 1.0 2.7 2.73 4 0.9 3.6 3.64 5 NaN 0.0 0.05 6 NaN 0.0 0.06 7 NaN 0.0 0.07 8 0.4 0.4 0.48 9 0.9 1.3 1.39 10 NaN 0.0 1.310 11 0.8 0.8 2.111 12 2.0 2.8 4.112 13 1.4 4.2 5.513 14 1.9 6.1 7.414 15 NaN 0.0 0.015 16 NaN 0.0 0.016 17 NaN 0.0 0.017 18 8.4 8.4 8.418 19 9.9 18.3 18.319 20 10.0 28.3 28.3