Группировка серии в Python - PullRequest
       28

Группировка серии в Python

6 голосов
/ 08 февраля 2011

Редактирование заголовка: исправлена ​​заглавная буква и добавлено «для python».

Есть ли лучший или более стандартный способ сделать то, что я описываю? Я хочу ввод, как это:

[1, 1, 1, 0, 2, 2, 0, 2, 2, 0, 0, 3, 3, 0, 1, 1, 1, 1, 1, 2, 2, 2]

будет преобразовано в это:

[0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 2, 0]

или, что еще лучше, что-то вроде этого (по-разному описываем аналогичный вывод, но теперь не ограничиваясь целыми числами):

ярлыки: [1, 2, 3, 1, 2]

позиций (где 1 идентифицировал первую занятую позицию, согласно моему графику matplotlib): [2, 7, 12.5, 17, 21]

Входные данные - это категориальные данные, которые классифицируют график - на рисунке ниже сгруппированные графики имеют общую характеристику, которую я хотел бы обозначить только один раз для группы. Я буду использовать 2 оси для двух разных переменных, но я думаю, что сейчас это не так.

Примечание. Это изображение не отражает ни одного из образцов данных - оно просто помогает понять идею группировки категорий. Группа a должна быть помечена как x = 5, поскольку между первыми двумя и вторыми вертикальными группами данных есть пробел, а 0 - строка справа.

Image demonstrating placement of tick marks in the center of a category of data

Вот что у меня есть:

data = [1, 1, 1, 2, 2, 2, 2, 2, 3, 4, 3, 2, 2, 1, 1, 1, 1]
last = None
runs = []
labels = []
run = 1
for x in data:
    if x in (last, 0):
        run += 1
    else:
        runs.append(run)
        run = 1
        labels.append(x)
    last = x
runs.append(run)
runs.pop(0)
labels.append(x)
tick_positions = [0]
last_run = 1
for run in runs:
    tick_positions.append(run/2.0+last_run/2.0+tick_positions[-1])
    last_run = run
tick_positions.pop(0)
print tick_positions

1 Ответ

8 голосов
/ 08 февраля 2011

Для получения меток вы можете использовать itertools groupby:

>>> import itertools
>>> numbers = [1, 1, 1, 0, 2, 2, 0, 2, 2, 0, 0, 3, 3, 0, 1, 1, 1, 1, 1, 2, 2, 2]
>>> list(k for k, g in itertools.groupby(numbers))
[1, 0, 2, 0, 2, 0, 3, 0, 1, 2]

А для удаления нулей вы можете использовать следующее:

>>> list(k for k, g in itertools.groupby(x for x in numbers if x != 0))
[1, 2, 3, 1, 2]

Если вы тоже хотите получить позиции, вам придется самим перебирать список, как вы уже это делаете.groupby не отслеживает это для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...