将DataFrame分成组-如何在DataFrame上使用窗口功能

时间:2018-12-21 02:26:48

标签: python pandas dataframe

我想将非零值分组在一起,其中一个组定义为包含所有非零值的顺序元素的子列表,这些子元素由周围的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 似乎解决了这类问题,但却空手而归。帮助,有人吗?

1 个答案:

答案 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