Разделение DataFrame на группы - как использовать оконную функцию в DataFrame - PullRequest
0 голосов
/ 21 декабря 2018

Я хочу сгруппировать ненулевые значения вместе, где группа определяется как подсписок последовательных элементов, которые содержат все ненулевые значения, разделенные окружающими 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() и т. д.), но ничего, что соответствует моим точным потребностям.Я нашел этот бит документации , который, кажется, решает проблему такого типа, но вышел с пустыми руками.Кто-нибудь поможет?

1 Ответ

0 голосов
/ 21 декабря 2018

Используя 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...