我想将非零值分组在一起,其中一个组定义为包含所有非零值的顺序元素的子列表,这些子元素由周围的0值元素分隔。例如:
values = [0, 0, 0, 1, 2, 3, 0, 0, 3, 3, 4, 3, 0, 0, 5]
... # do some splitting, grouping, black magic, etc.
values = [[1, 2, 3], [3, 3, 4, 3], [5]]
这个概念听起来有点像在PostgreSQL中使用窗口功能。我正在尝试找出一种有效/优雅的方法来使用DataFrame做同样的事情。
我正在处理时间数据,因此生成的组也需要保持其原始顺序。例如,假设我有以下DataFrame:
timestamp value
2018-01-01 0
2018-01-02 0
2018-01-03 1
2018-01-04 2
2018-01-05 3
2018-01-06 0
2018-01-07 0
2018-01-08 3
2018-01-09 0
2018-01-11 5
2018-01-12 5
2018-01-13 3
2018-01-14 0
2018-01-15 5
将其分为不同的组之后,我希望每个组都是:
# Group 1
2018-01-03 1
2018-01-04 2
2018-01-05 3
# Group 2
2018-01-08 3
# Group 3
2018-01-11 5
2018-01-12 5
2018-01-13 3
# Group 4
2018-01-15 5
我已经看到类似的问题,这些问题在DataFrame上使用了各种方法(groupby()
,cumsum()
,rolling()
等),但是没有任何适合我的确切需求的问题。我发现this bit of documentation
似乎解决了这类问题,但却空手而归。帮助,有人吗?
答案 0 :(得分:1)
使用cumsum
创建组密钥(PS:我将结果保存到dict中,这样更容易获得值)
d={x+1 : y[1] for x , y in enumerate(df[df.value.ne(0)].groupby(df.value.eq(0).cumsum()))}
d[1]
timestamp value
2 2018-01-03 1
3 2018-01-04 2
4 2018-01-05 3
更多信息
for x , y in df[df.value.ne(0)].groupby(df.value.eq(0).cumsum()):
print(y)
timestamp value
2 2018-01-03 1
3 2018-01-04 2
4 2018-01-05 3
timestamp value
7 2018-01-08 3
timestamp value
9 2018-01-11 5
10 2018-01-12 5
11 2018-01-13 3
timestamp value
13 2018-01-15 5