拆分DataFrame成组 - 如何在DataFrame上使用窗口函数

2024-06-12 04:57:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我想将非零值分组在一起,其中一个组被定义为包含所有非零值的序列元素的子列表,由周围的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中使用窗口函数。我正试图找到一种高效/优雅的方法,用数据帧做同样的事情

我处理的是时态数据,因此生成的组还需要保持其原始顺序。例如,假设我有以下数据帧:

 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

我见过类似的问题,在数据帧上使用各种方法(groupby()cumsum()rolling(),等等),但没有任何方法符合我的确切需要。我找到了this bit of documentation 这似乎解决了这类问题,但结果却是空手而归。有人帮忙吗


Tags: 数据方法元素列表定义magicgroupetc
1条回答
网友
1楼 · 发布于 2024-06-12 04:57:29

使用cumsum创建组键(PS:I将结果保存到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

相关问题 更多 >